Utilice sigaction para establecer el modo de procesamiento de señales para la comunicación entre procesos

Uno, introducción a la función sigaction

Archivo de encabezado: signal.h

Prototipo de interfaz: int sigaction (int signum, const struct sigaction * act, struct sigaction * oldact);

Función: 1. Consultar el método de procesamiento de señales a través de oldact, 2. Establecer el método de procesamiento de señales a través de act.

Descripción de parámetros:

  • signum: La señal que se va a operar Se pueden especificar todas las señales excepto SIGKILL y SIGSTOP.
  • acto: El nuevo método de procesamiento de la señal que se va a configurar.
  • oldact: Obtiene el método de procesamiento original de la señal.

Valor de retorno: 0 significa éxito, -1 significa que ocurrió un error.

Dos, estructura estructura descripción de la acción

 El tipo struct sigaction se utiliza para describir el procesamiento de señales y se define de la siguiente manera:
 struct sigaction
 {       void (* sa_handler) (int);       void (* sa_sigaction) (int, siginfo_t *, void *);       sigset_t sa_mask;       int sa_flags ;       void (* sa_restorer) (vacío);  };





Descripción del miembro de la estructura:

sa_handler es un puntero de función y su significado es similar al de la función de procesamiento de señal en la función de señal.

sa_sigaction es otra función de procesamiento de señal, tiene tres parámetros, puede obtener información más detallada sobre la señal. Cuando el valor del miembro sa_flags contiene la bandera SA_SIGINFO, el sistema utilizará la función sa_sigaction como función de procesamiento de señales, de lo contrario utilizará sa_handler como función de procesamiento de señales. En algunos sistemas, los miembros sa_handler y sa_sigaction se colocan en la unión, por lo que no los configure al mismo tiempo cuando los use.
El miembro sa_mask se utiliza para especificar la señal que debe enmascararse durante la ejecución de la función de procesamiento de señal, especialmente cuando se procesa una señal, se colocará automáticamente en la máscara de señal del proceso, por lo que esta señal no se usa durante La ejecución de la función de procesamiento de señales se repetirá.
El miembro sa_flags se utiliza para especificar el comportamiento del procesamiento de la señal. Puede ser una combinación "OR bit a bit" de los siguientes valores.
     ◆ SA_RESTART: hace que la llamada al sistema interrumpida por la señal se reinicie automáticamente.
     ◆ SA_NOCLDSTOP: el proceso padre no recibirá la señal SIGCHLD cuando su proceso hijo se suspenda o continúe ejecutándose.
     ◆ SA_NOCLDWAIT: El proceso padre no recibirá la señal SIGCHLD cuando su proceso hijo finalice. En este momento, el proceso hijo no se convertirá en un proceso zombie si sale.
     ◆ SA_NODEFER: Invalida el blindaje de la señal, es decir, la señal aún se puede enviar durante la ejecución de la función de procesamiento de señal.
     ◆ SA_RESETHAND: restablece el modo de procesamiento predeterminado después del procesamiento de la señal.
     ◆ SA_SIGINFO: Utilice el miembro sa_sigaction en lugar de sa_handler como función de procesamiento de señales.

 El miembro re_restorer es un campo de datos obsoleto, no lo use.

Tres, una simple castaña

#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <errno.h>

void sigHandler(int signum)
{
    if (signum == SIGUSR1)
    {
        printf("receive signal SIGUSR1.\n");
    }
    else if (signum == SIGUSR2)
    {
        printf("receive signal SIGUSR2.\n");
    }
    else
    {
        printf("receive signal %d.\n", signum);
    }
}

int main()
{
    struct sigaction sigact;
    sigact.sa_flags = 0;
    sigact.sa_handler = sigHandler;

    sigaction(SIGUSR1, &sigact, NULL);
    sigaction(SIGUSR2, &sigact, NULL);

    printf("Current process id is %d\n", getpid());

    while (1)
    {
        int n = 0;
        char buf[512];
        if ((n = read(STDIN_FILENO, buf, 511)) == -1)
        {
            if (errno == EINTR)   // nterrupted system call 
            {
                printf("read is interrupted by signal\n");
            }
        }
        else
        {
            buf[n] = '\0';
            printf("%d bytes read %s\n", n , buf);
        }
    }
    
    return 0;
}

Resultados del:

Supongo que te gusta

Origin blog.csdn.net/xunye_dream/article/details/109565874
Recomendado
Clasificación