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 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 |
|
Valor |
Origen de la señal |
SI_USER |
kill, sigsend o raise |
SI_KERNEL |
El núcleo |
SI_QUEUE |
sigqueue |
SI_TIMER |
el cronómetro ha vencido |
SI_MESGQ |
ha cambiado el estado de mesq |
SI_ASYNCIO |
ha terminado una E/S asíncrona |
SI_SIGIO |
SIGIO encolada |
SIGILL |
|
ILL_ILLOPC |
código de operación ilegal |
ILL_ILLOPN |
operando ilegal |
ILL_ILLADR |
modo de direccionamiento ilegal |
ILL_ILLTRP |
trampa ilegal |
ILL_PRVOPC |
código de operación privilegiada |
ILL_PRVREG |
registro privilegiado |
ILL_COPROC |
error del coprocesador |
ILL_BADSTK |
error de la pila interna |
SIGFPE |
|
FPE_INTDIV |
entero dividido por cero |
FPE_INTOVF |
desbordamiento de entero |
FPE_FLTDIV |
punto flotante dividido por cero |
FPE_FLTOVF |
desbordamiento de punto flotante |
FPE_FLTUND |
desbordamiento de punto flotante por defecto |
FPE_FLTRES |
resultado de punto flotante inexacto |
FPE_FLTINV |
operación de punto flotante inválida |
FPE_FLTSUB |
subscript fuera de rango |
SIGSEGV |
|
SEGV_MAPERR |
dirección no asociada a un objeto |
SEGV_ACCERR |
permisos inválidos para un objeto presente en memoria |
SIGBUS |
|
BUS_ADRALN |
alineamiento de dirección inválido |
BUS_ADRERR |
dirección física inexistente |
BUS_OBJERR |
error hardware específico del objeto |
SIGTRAP |
|
TRAP_BRKPT |
punto de parada de un proceso |
TRAP_TRACE |
trampa de seguimiento paso a paso de un proceso |
SIGCHLD |
|
CLD_EXITED |
ha terminado un hijo |
CLD_KILLED |
se ha matado a un hijo |
CLD_DUMPED |
un hijo ha terminado anormalmente |
CLD_TRAPPED |
un hijo con seguimiento paso a paso ha sido detenido |
CLD_STOPPED |
ha parado un hijo |
CLD_CONTINUED |
un hijo parado ha continuado |
SIGPOLL |
|
POLL_IN |
datos de entrada disponibles |
POLL_OUT |
buffers de salida disponibles |
POLL_MSG |
mensaje de entrada disponible |
POLL_ERR |
error de E/S |
POLL_PRI |
entrada de alta prioridad disponible |
POLL_HUP |
dispositivo 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.
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.
VÉASE TAMBIÉN¶
kill(1),
kill(2),
killpg(2),
pause(2),
sigaltstack(2),
raise(3),
siginterrupt(3),
signal(2),
signal(7),
sigsetops(3),
sigvec(2)