Provided by: manpages-es_1.55-10_all bug

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.

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.

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)