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

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)