prototipo de función sigaction
#include <signal.h>
int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
};
Descripción de parámetros:
void(*sa_handler)(int);
/*信号处理函数,不接受额外数据,SIG_IGN 为忽略,SIG_DFL 为默认动作,如果 sa_flags 中存在SA_SIGINFO 标志,
那么 sa_sigaction 将作为 signum 信号的处理函数,否则用 sa_handler */
void(*sa_sigaction)(int, siginfo_t *, void *);
//信号处理函数,能够接受额外数据和 sigqueue 配合使用
sigset_t sa_mask;
//阻塞关键字的信号集,可以在调用捕捉函数之前把信号添加到信号阻塞字,信号捕捉函数返回之前恢复为原先的值
int sa_flags;
//影响信号的行为,SA_SIGINFO 表示能够接受数据
-
función sigactionEs una llamada al sistema, de acuerdo con el prototipo de función, podemos ver que en el prototipo de función, el primer
signum
número de parámetro que se registra debe señalizar; el segundo argumentoact
, si no es nulo, ilustra la necesidad de una nueva configuración de la señal; el tercer parámetrooldact
para realizar una recuperación si no lo hace, puede hacer una copia de seguridad de la configuración antes de que la señal esté vacía, para facilitar. -
estructura sigaction estructuraLos
sa_mask
miembros fijan su enfoque en la señal de la señal que se establecerá para bloquear antes de capturar llamadas de función, y restaurarán la configuración predeterminada original cuando la función de captura regrese. El propósito de esto es bloquear la señal de escritura silenciosa cuando se llama a la función de procesamiento de señales. Cuando se llama a la función de procesamiento de señales, el sistema operativo creará una nueva palabra de bloqueo de señales, incluida la señal que se envía. Por tanto, se puede garantizar que al procesar una determinada señal, si este tipo de señal se repite, se bloqueará hasta que finalice el procesamiento de la señal anterior. -
función sigactionPuntualidad: cuando se establece una acción específica para una determinada señal, hasta que se vuelva a llamar explícitamentefunción sigactionY seguirá siendo válido hasta que se cambie la acción.
-
void (* sa_sigaction) (int, siginfo_t *, void *); función de procesamiento, El primer parámetro
int
es una señal; el tercer parámetrovoid *
son los datos adicionales transportados por la señal recibida, no está vacío, son datos adicionales; y el segundo parámetrostruct siginfo_t
de esta estructura se aplica principalmente para registrar alguna información en la señal recibida
siginfo_t {
int si_signo; /* Signal number */
int si_errno; /* An errno value */
int si_code; /* Signal code */
int si_trapno; /* Trap number that caused
hardware-generated signal
(unused on most architectures) */
pid_t si_pid; /* Sending process ID */
uid_t si_uid; /* Real user ID of sending process */
int si_status; /* Exit value or signal */
clock_t si_utime; /* User time consumed */
clock_t si_stime; /* System time consumed */
sigval_t si_value; /* Signal value */
int si_int; /* POSIX.1b signal */
void *si_ptr; /* POSIX.1b signal */
int si_overrun; /* Timer overrun count; POSIX.1b timers */
int si_timerid; /* Timer ID; POSIX.1b timers */
void *si_addr; /* Memory location which caused fault */
long si_band; /* Band event (was int in
glibc 2.3.2 and earlier) */
int si_fd; /* File descriptor */
short si_addr_lsb; /* Least significant bit of address
(since kernel 2.6.32) */
}
-
La señal se puede adquirir a través de esta estructura información relevante,
si_signo
ysi_code
que se deben implementar dos miembros -
Acerca de dos datos locales enviados desde la presencia de:
si_value
guardar la información enviada al mismo tiempo, ensi_int
o lossi_ptr
miembros también guardan los datos correspondientes
Función de señalización
#include <signal.h>
int sigqueue(pid_t pid, int sig, const union sigval value);
union sigval {
int sival_int;
void *sival_ptr;
};
1. Utilizarfunción sigqueueantes de,función sigactionNecesidad de desarrollar SA_SIGINFO
signos
2,estructura de sigactionLos sa_sigaction
miembros proporcionan funciones de captura de señal. Si la implementación es sa_handler
un miembro, entonces no podrá obtener datos adicionales transportados
3,función sigqueueSolo una única señal de transmisión a un proceso que se puede value
transferir a un valor entero o un valor de puntero de los parámetros de la función de procesamiento de señales
4,función sigqueueNo solo puede enviar datos adicionales, también puede poner en cola la señal (el sistema operativo debe implementarPOSIX.1La extensión en tiempo real), proporcionada para la señal de bloqueo, el uso de sigqueue
señales de transmisión una pluralidad de las mismas, cuando se desbloquea, el destinatario recibirá la señal transmitida en la cola, en lugar de recibir la hora directamente; sin embargo, la señal no puede Ser línea ilimitada, el valor máximo de la línea de señal está sujeto a SIGQUEUE_MAX
restricciones, se alcanza el límite máximo, sigqueue
fallará, errno
se estableceráEAGAIN
Ejemplo:
Extremo de recepción:
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
//void (*sa_sigaction)(int, siginfo_t *, void *);
void handler(int signum, siginfo_t *info, void *context)
{
printf("Get the signum:No(%d),SIGUSR1\n",signum);
if(context){
printf("content:%d\n",info->si_int);
printf("content:%d\n",info->si_value.sival_int);
}
}
void main()
{
struct sigaction act;
/*
struct sigaction {
void (*sa_handler)(int);
void (*sa_sigaction)(int, siginfo_t *, void *);
sigset_t sa_mask;
int sa_flags;
};
*/
act.sa_sigaction = handler;
act.sa_flags = SA_SIGINFO;
printf("pid:%d\n",getpid());
// int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);
sigaction(SIGUSR1,&act,NULL);
while(1);
}
Envío final:
#include <stdio.h>
#include <signal.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
void main(int argc, char **argv)
{
if(argc != 3){
printf("Parameter error!\n");
exit(1);
}
int signum = atoi(argv[1]);
int pid = atoi(argv[2]);
/*
union sigval {
int sival_int;
void *sival_ptr;
};
*/
union sigval value;
value.sival_int = 888;
//int sigqueue(pid_t pid, int sig, const union sigval value);
sigqueue(pid,signum,value);
}
resultado de la operación:
Extremo de recepción:
:~$ ./sigreceive
pid:18883
Get the signum:No(10),SIGUSR1
context:888
context:888
Envío final:
:~$ ./sigsend 10 18883