Provided by:
manpages-es_1.55-10_all 
NOMBRE
sigaction, sigprocmask, sigpending, sigsuspend - funciones POSIX de
manejo de senales
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'ON
La llamad al sistema sigaction se emplea para cambiar la accion tomada
por un proceso cuando recibe una determinada senal.
signum especifica la senal y puede ser cualquiera valida salvo SIGKILL
o SIGSTOP.
Si act no es nulo, la nueva accion para la senal signum se instala como
act. Si oldact no es nulo, la accion 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 esta obsoleto y no deberia utilizarse. POSIX no
especifica un elemento sa_restorer.
sa_handler especifica la accion que se va a asociar con signum y puede
ser SIG_DFL para la accion predeterminada, SIG_IGN para no tener en
cuenta la senal, o un puntero a una funcion manejadora para la senal.
sa_mask da una mascara de senales que deberian bloquearse durante la
ejecucion del manejador de senal. Ademas, la senal que lance el
manejador sera 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 senal. Se forma por la
aplicacion del operador de bits OR a cero o mas de las siguientes
constantes:
SA_NOCLDSTOP
Si signum es SIGCHLD, no se reciba notificacion cuando
los procesos hijos se paren (esto es, cuando los procesos
hijos reciban una de las senales SIGSTOP, SIGTSTP,
SIGTTIN o SIGTTOU).
SA_ONESHOT o SA_RESETHAND
Restaurese la accion para la senal al estado
predeterminado una vez que el manejador de senal haya
sido llamado.
SA_ONSTACK
Llama al manejador de senal en una pila de senales
alternativa proporcionada por sigaltstack(2). Si esta
pila alternativa no esta disponible, se utilizara la pila
por defecto.
SA_RESTART
Proporciona un comportamiento compatible con la semantica
de senales de BSD haciendo re-ejecutables algunas
llamadas al sistema entre senales.
SA_NOMASK o SA_NODEFER
No se impida que se reciba la senal desde su propio
manejador.
SA_SIGINFO
El manejador de senal toma 3 argumentos, no uno. En este
caso, se debe configurar sa_sigaction en lugar de
sa_handler. (El campo sa_sigaction fue anadido en la
version 2.1.86 de Linux.)
El parametro siginfo_t para sa_sigaction es una estructura con los
siguientes elementos
siginfo_t {
int si_signo; /* Numero de senal */
int si_errno; /* Un valor errno */
int si_code; /* Codigo de senal */
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 senal */
clock_t si_utime; /* Tiempo de usuario consumido */
clock_t si_stime; /* Tiempo de sistema consumido */
sigval_t si_value; /* Valor de senal */
int si_int; /* senal POSIX.1b */
void * si_ptr; /* senal POSIX.1b */
void * si_addr; /* Direccion 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 estan definidos para todas las senales.
El resto de la estructura puede ser una union, por lo que deberian
leerse solamente los campos que sean de interes para la senal dada.
kill(2), las senales POSIX.1b y SIGCHLD rellenan si_pid y si_uid.
SIGCHLD tambien rellena si_status, si_utime y si_stime. si_int y
si_ptr son especificados por el emisor de la senal POSIX.1b.
SIGILL, SIGFPE, SIGSEGV y SIGBUS rellenan si_addr con la direccion del
fallo. SIGPOLL rellena si_band y si_fd.
si_code indica por que se ha enviado la senal. Es un valor, no una
mascara de bits. Los valores que son posibles para cualquier senal se
listan en la siguiente tabla:
+--------------------------------------------+
| si_code |
+-----------+--------------------------------+
|Valor | Origen de la senal |
+-----------+--------------------------------+
|SI_USER | kill, sigsend o raise |
+-----------+--------------------------------+
|SI_KERNEL | El nucleo |
+-----------+--------------------------------+
|SI_QUEUE | sigqueue |
+-----------+--------------------------------+
|SI_TIMER | el cronometro ha vencido |
+-----------+--------------------------------+
|SI_MESGQ | ha cambiado el estado de mesq |
+-----------+--------------------------------+
|SI_ASYNCIO | ha terminado una E/S asincrona |
+-----------+--------------------------------+
|SI_SIGIO | SIGIO encolada |
+-----------+--------------------------------+
+----------------------------------------------+
| SIGILL |
+-----------+----------------------------------+
|ILL_ILLOPC | codigo de operacion ilegal |
+-----------+----------------------------------+
|ILL_ILLOPN | operando ilegal |
+-----------+----------------------------------+
|ILL_ILLADR | modo de direccionamiento ilegal |
+-----------+----------------------------------+
|ILL_ILLTRP | trampa ilegal |
+-----------+----------------------------------+
|ILL_PRVOPC | codigo de operacion 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 | operacion de punto flotante invalida |
+-----------+----------------------------------------------+
|FPE_FLTSUB | subscript fuera de rango |
+-----------+----------------------------------------------+
+--------------------------------------------------------------------+
| SIGSEGV |
+------------+-------------------------------------------------------+
|SEGV_MAPERR | direccion no asociada a un objeto |
+------------+-------------------------------------------------------+
|SEGV_ACCERR | permisos invalidos para un objeto presente en memoria |
+------------+-------------------------------------------------------+
+--------------------------------------------------+
| SIGBUS |
+-----------+--------------------------------------+
|BUS_ADRALN | alineamiento de direccion invalido |
+-----------+--------------------------------------+
|BUS_ADRERR | direccion fisica inexistente |
+-----------+--------------------------------------+
|BUS_OBJERR | error hardware especifico 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 senales
bloqueadas actualmente. El comportamiento de la llamada depende del
valor de how, como sigue:
SIG_BLOCK
El conjunto de senales bloqueadas es la union del
conjunto actual y el argumento set.
SIG_UNBLOCK
Las senales en set se quitan del conjunto actual de
senales bloqueadas. Es legal intentar el desbloqueo de
una senal que no esta bloqueada.
SIG_SETMASK
El conjunto de senales bloqueadas se pone segun el
argumento set.
Si oldset no es nulo, el valor anterior de la mascara de senal se
guarda en oldset.
La llamada sigpending permite el examen de senales pendientes (las que
han sido producidas mientras estaban bloqueadas). La mascara de senal
de las senales pendientes se guarda en set.
La llamada sigsuspend reemplaza temporalmente la mascara de senal para
el proceso con la dada por mask y luego suspende el proceso hasta que
se recibe una senal.
VALOR DEVUELTO
Las funciones sigaction, sigprocmask y sigpending devuelven 0 en caso
de exito y -1 en caso de error. La funcion sigsuspend siempre devuelve
-1, normalmente acompanado del error EINTR.
ERRORES
EINVAL Se ha especificado una senal invalida. Esto tambien se genera si
se hace un intento de cambiar la accion 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 valida 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 seran tenidos en cuenta,
silenciosamente.
De acuerdo con POSIX, el comportamiento de un proceso esta indefinido
despues de que no haga caso de una senal SIGFPE, SIGILL o SIGSEGV que
no haya sido generada por las funciones kill() o raise(). La division
entera por cero da un resultado indefinido. En algunas arquitecturas
generara una senal SIGFPE. (Tambien, el dividir el entero mas negativo
por -1 puede generar una senal SIGFPE.) No hacer caso de esta senal
puede llevar a un bucle infinito.
POSIX (B.3.3.1.3) anula el establecimiento de SIG_IGN como accion para
SIGCHLD. Los comportamientos de BSD y SYSV difieren, provocando el
fallo en Linux de aquellos programas BSD que asignan SIG_IGN como
accion para SIGCHLD.
La especificacion POSIX solo define SA_NOCLDSTOP. El empleo de otros
valores en sa_flags no es transportable.
La opcion SA_RESETHAND es compatible con la de SVr4 del mismo nombre.
La opcion SA_NODEFER es compatible con la de SVr4 del mismo nombre bajo
los nucleos 1.3.9 y posteriores. En nucleos mas viejos la
implementacion de Linux permitia la recepcion de cualquier senal, no
solo la que estabamos instalando (sustituyendo asi efectivament
cualquier valor de sa_mask).
Los nombres SA_RESETHAND y SA_NODEFER para compatibilidad con SVr4
estan presentes solamente en las versiones de la biblioteca 3.0.9 y
mayores.
La opcion SA_SIGINFO viene especificada por POSIX.1b. El soporte para
ella se anadio en la version 2.2 de Linux.
sigaction puede llamarse con un segundo argumento nulo para saber el
manejador de senal en curso. Tambien puede emplearse para comprobar si
una senal dada es valida para la maquina donde se esta, llamandola con
el segundo y el tercer argumento nulos.
Vea sigsetops(3) para detalles sobre manipulacion de conjuntos de
senales.
CONFORME A
POSIX, SVr4. SVr4 no documenta la condicion EINTR.
SIN DOCUMENTAR
Antes de la introduccion de SA_SIGINFO tambien era posible obtener
informacion adicional, usando un manejador sa_handler con el segundo
argumento del tipo struct sigcontext. Vea las fuentes del nucleo
relevantes para mas detalles. Este uso esta obsoleto en la actualidad.
V'EASE TAMBI'EN
kill(1), kill(2), killpg(2), pause(2), sigaltstack(2), raise(3),
siginterrupt(3), signal(2), signal(7), sigsetops(3), sigvec(2)