SIGACTION(2)

NOMBRE
sigaction, sigprocmask, sigpending, sigsuspend - funciones POSIX de manejo de señales

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

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

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. (Esto es el comportamiento predeterminado de la llamada al sistema signal(2).)

    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.

El elemento sa_restorer está anticuado y no debería emplearse.

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.

VALORES DEVUELTOS
sigaction, sigprocmask, sigpending y sigsuspend devuelven 0 en caso de éxito y -1 en caso de error.

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 u oldset 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. No hacer caso de esta señal puede llevar a un bucle infinito.

El poner SIGCHLD a SIG_IGN proporciona la cosecha automática de procesos hijos.

La espec. 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.

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 CON
POSIX, SVr4. SVr4 no documenta la condición EINTR.

CONSULTE TAMBIÉN
kill(1), kill(2), killpg(2), pause(2), raise(3), siginterrupt(3), signal(2), signal(7), sigsetops(3), sigvec(2)