Función sigaction de la versión avanzada de la señal de programación del sistema Linux

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 signumnúmero de parámetro que se registra debe señalizar; el segundo argumento act, si no es nulo, ilustra la necesidad de una nueva configuración de la señal; el tercer parámetro oldactpara 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_maskmiembros 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 intes una señal; el tercer parámetro void *son los datos adicionales transportados por la señal recibida, no está vacío, son datos adicionales; y el segundo parámetro struct siginfo_tde 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_signoy si_codeque se deben implementar dos miembros

  • Acerca de dos datos locales enviados desde la presencia de: si_valueguardar la información enviada al mismo tiempo, en si_into los si_ptrmiembros 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_SIGINFOsignos
2,estructura de sigactionLos sa_sigactionmiembros proporcionan funciones de captura de señal. Si la implementación es sa_handlerun 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 valuetransferir 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 sigqueueseñ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_MAXrestricciones, se alcanza el límite máximo, sigqueuefallará, errnose 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

Supongo que te gusta

Origin blog.csdn.net/lcx1837/article/details/108018158
Recomendado
Clasificación