sigprocmask(2) funciones POSIX de

Other Alias

sigaction, sigpending, sigsuspend

SINOPSIS

#include <signal.h>

int sigaction(int signum, const struct sigaction *act, struct sigaction *oldact);

int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);

int sigpending(sigset_t *set);

int sigsuspend(const sigset_t *mask);

DESCRIPCIÓN

La llamad al sistema sigaction se emplea para cambiar la acción tomada por un proceso cuando recibe una determinada señal.

signum especifica la señal y puede ser cualquiera válida salvo SIGKILL o SIGSTOP.

Si act no es nulo, la nueva acción para la señal signum se instala como act. Si oldact no es nulo, la acción anterior se guarda en oldact.

La estructura sigaction se define como algo parecido a

struct sigaction {
    void (*sa_handler)(int);
    void (*sa_sigaction)(int, siginfo_t *, void *);
    sigset_t sa_mask;
    int sa_flags;
    void (*sa_restorer)(void);
}

En algunas arquitecturas se utiliza una union - no asigne valores a sa_handler y sa_sigaction.

El elemento sa_restorer está obsoleto y no debería utilizarse. POSIX no especifica un elemento sa_restorer.

sa_handler especifica la acción que se va a asociar con signum y puede ser SIG_DFL para la acción predeterminada, SIG_IGN para no tener en cuenta la señal, o un puntero a una función manejadora para la señal.

sa_mask da una máscara de señales que deberían bloquearse durante la ejecución del manejador de señal. Además, la señal que lance el manejador será bloqueada, a menos que se activen las opciones SA_NODEFER o SA_NOMASK.

sa_flags especifica un conjunto de opciones que modifican el comportamiento del proceso de manejo de señal. Se forma por la aplicación del operador de bits OR a cero o más de las siguientes constantes:

SA_NOCLDSTOP
Si signum es SIGCHLD, no se reciba notificación cuando los procesos hijos se paren (esto es, cuando los procesos hijos reciban una de las señales SIGSTOP, SIGTSTP, SIGTTIN o SIGTTOU).
SA_ONESHOT o SA_RESETHAND
Restáurese la acción para la señal al estado predeterminado una vez que el manejador de señal haya sido llamado.
SA_ONSTACK
Llama al manejador de señal en una pila de señales alternativa proporcionada por sigaltstack(2). Si esta pila alternativa no está disponible, se utilizará la pila por defecto.
SA_RESTART
Proporciona un comportamiento compatible con la semántica de señales de BSD haciendo re-ejecutables algunas llamadas al sistema entre señales.
SA_NOMASK o SA_NODEFER
No se impida que se reciba la señal desde su propio manejador.
SA_SIGINFO
El manejador de señal toma 3 argumentos, no uno. En este caso, se debe configurar sa_sigaction en lugar de sa_handler. (El campo sa_sigaction fue añadido en la versión 2.1.86 de Linux.)

El parámetro siginfo_t para sa_sigaction es una estructura con los siguientes elementos

siginfo_t {
    int      si_signo;  /* Número de señal */
    int      si_errno;  /* Un valor errno */
    int      si_code;   /* Código de señal */
    pid_t    si_pid;    /* ID del proceso emisor */
    uid_t    si_uid;    /* ID del usuario real del proceso emisor */
    int      si_status; /* Valor de salida o señal */
    clock_t  si_utime;  /* Tiempo de usuario consumido */
    clock_t  si_stime;  /* Tiempo de sistema consumido */
    sigval_t si_value;  /* Valor de señal */
    int      si_int;    /* señal POSIX.1b */
    void *   si_ptr;    /* señal POSIX.1b */
    void *   si_addr;   /* Dirección de memoria que ha producido el fallo */
    int      si_band;   /* Evento de conjunto */
    int      si_fd;     /* Descriptor de fichero */
}
si_signo, si_errno y si_code están definidos para todas las señales. El resto de la estructura puede ser una unión, por lo que deberían leerse solamente los campos que sean de interés para la señal dada. kill(2), las señales POSIX.1b y SIGCHLD rellenan si_pid y si_uid. SIGCHLD también rellena si_status, si_utime y si_stime. si_int y si_ptr son especificados por el emisor de la señal POSIX.1b.
 SIGILL, SIGFPE, SIGSEGV y SIGBUS rellenan si_addr con la dirección del fallo. SIGPOLL rellena si_band y si_fd.

si_code indica por qué se ha enviado la señal. Es un valor, no una máscara de bits. Los valores que son posibles para cualquier señal se listan en la siguiente tabla:

si_code
ValorOrigen de la señal
SI_USERkill, sigsend o raise
SI_KERNELEl núcleo
SI_QUEUEsigqueue
SI_TIMERel cronómetro ha vencido
SI_MESGQha cambiado el estado de mesq
SI_ASYNCIOha terminado una E/S asíncrona
SI_SIGIOSIGIO encolada

SIGILL
ILL_ILLOPCcódigo de operación ilegal
ILL_ILLOPNoperando ilegal
ILL_ILLADRmodo de direccionamiento ilegal
ILL_ILLTRPtrampa ilegal
ILL_PRVOPCcódigo de operación privilegiada
ILL_PRVREGregistro privilegiado
ILL_COPROCerror del coprocesador
ILL_BADSTKerror de la pila interna

SIGFPE
FPE_INTDIVentero dividido por cero
FPE_INTOVFdesbordamiento de entero
FPE_FLTDIVpunto flotante dividido por cero
FPE_FLTOVFdesbordamiento de punto flotante
FPE_FLTUNDdesbordamiento de punto flotante por defecto
FPE_FLTRESresultado de punto flotante inexacto
FPE_FLTINVoperación de punto flotante inválida
FPE_FLTSUBsubscript fuera de rango

SIGSEGV
SEGV_MAPERRdirección no asociada a un objeto
SEGV_ACCERRpermisos inválidos para un objeto presente en memoria

SIGBUS
BUS_ADRALNalineamiento de dirección inválido
BUS_ADRERRdirección física inexistente
BUS_OBJERRerror hardware específico del objeto

SIGTRAP
TRAP_BRKPTpunto de parada de un proceso
TRAP_TRACEtrampa de seguimiento paso a paso de un proceso

SIGCHLD
CLD_EXITEDha terminado un hijo
CLD_KILLEDse ha matado a un hijo
CLD_DUMPEDun hijo ha terminado anormalmente
CLD_TRAPPEDun hijo con seguimiento paso a paso ha sido detenido
CLD_STOPPEDha parado un hijo
CLD_CONTINUEDun hijo parado ha continuado

SIGPOLL
POLL_INdatos de entrada disponibles
POLL_OUTbuffers de salida disponibles
POLL_MSGmensaje de entrada disponible
POLL_ERRerror de E/S
POLL_PRIentrada de alta prioridad disponible
POLL_HUPdispositivo desconectado

La llamada sigprocmask se emplea para cambiar la lista de señales bloqueadas actualmente. El comportamiento de la llamada depende del valor de how, como sigue:

SIG_BLOCK
El conjunto de señales bloqueadas es la unión del conjunto actual y el argumento set.
SIG_UNBLOCK
Las señales en set se quitan del conjunto actual de señales bloqueadas. Es legal intentar el desbloqueo de una señal que no está bloqueada.
SIG_SETMASK
El conjunto de señales bloqueadas se pone según el argumento set.

Si oldset no es nulo, el valor anterior de la máscara de señal se guarda en oldset.

La llamada sigpending permite el examen de señales pendientes (las que han sido producidas mientras estaban bloqueadas). La máscara de señal de las señales pendientes se guarda en set.

La llamada sigsuspend reemplaza temporalmente la máscara de señal para el proceso con la dada por mask y luego suspende el proceso hasta que se recibe una señal.

VALOR DEVUELTO

Las funciones sigaction, sigprocmask y sigpending devuelven 0 en caso de éxito y -1 en caso de error. La función sigsuspend siempre devuelve -1, normalmente acompañado del error EINTR.

ERRORES

EINVAL
Se ha especificado una señal inválida. Esto también se genera si se hace un intento de cambiar la acción para SIGKILL o SIGSTOP, que no pueden ser capturadas.
EFAULT
act, oldact, set, oldset u mask apuntan a una zona de memoria que no forma parte válida del espacio de direcciones del proceso.
EINTR
La llamada al sistema ha sido interrumpida.

OBSERVACIONES

No es posible bloquear SIGKILL ni SIGSTOP con una llamada a sigprocmask. Los intentos de hacerlo no serán tenidos en cuenta, silenciosamente.

De acuerdo con POSIX, el comportamiento de un proceso está indefinido después de que no haga caso de una señal SIGFPE, SIGILL o SIGSEGV que no haya sido generada por las funciones kill() o raise(). La división entera por cero da un resultado indefinido. En algunas arquitecturas generará una señal SIGFPE. (También, el dividir el entero más negativo por -1 puede generar una señal SIGFPE.) No hacer caso de esta señal puede llevar a un bucle infinito.

POSIX (B.3.3.1.3) anula el establecimiento de SIG_IGN como acción para SIGCHLD. Los comportamientos de BSD y SYSV difieren, provocando el fallo en Linux de aquellos programas BSD que asignan SIG_IGN como acción para SIGCHLD.

La especificación POSIX sólo define SA_NOCLDSTOP. El empleo de otros valores en sa_flags no es transportable.

La opción SA_RESETHAND es compatible con la de SVr4 del mismo nombre.

La opción SA_NODEFER es compatible con la de SVr4 del mismo nombre bajo los núcleos 1.3.9 y posteriores. En núcleos más viejos la implementación de Linux permitía la recepción de cualquier señal, no sólo la que estábamos instalando (sustituyendo así efectivament cualquier valor de sa_mask).

Los nombres SA_RESETHAND y SA_NODEFER para compatibilidad con SVr4 están presentes solamente en las versiones de la biblioteca 3.0.9 y mayores.

La opción SA_SIGINFO viene especificada por POSIX.1b. El soporte para ella se añadió en la versión 2.2 de Linux.

sigaction puede llamarse con un segundo argumento nulo para saber el manejador de señal en curso. También puede emplearse para comprobar si una señal dada es válida para la máquina donde se está, llamándola con el segundo y el tercer argumento nulos.

Vea sigsetops(3) para detalles sobre manipulación de conjuntos de señales.

CONFORME A

POSIX, SVr4. SVr4 no documenta la condición EINTR.

SIN DOCUMENTAR

Antes de la introducción de SA_SIGINFO también era posible obtener información adicional, usando un manejador sa_handler con el segundo argumento del tipo struct sigcontext. Vea las fuentes del núcleo relevantes para más detalles. Este uso está obsoleto en la actualidad.