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

NOMBRE

       sigaltstack - definir y/u obtener el contexto de la pila de señales

SINOPSIS

       #include <signal.h>

       int sigaltstack(const stack_t *ss, stack_t *oss);

DESCRIPCIÓN

       sigaltstack  permite  a  un  proceso  definir  una  nueva  pila alternativa de señales y/o
       recuperar el estado de una pila alternativa de señales existente. Una pila alternativa  de
       señales  se  usa  durante la ejecución de un manejador de señales si el establecimiento de
       ese manejador (ver sigaction(2)) lo solicita.

       La secuencia normal de eventos para usar una pila alternativa de señales es la siguiente:

       1.     Reservar un área de memoria para ser utilizada por la pila alternativa de señales.

       2.     Utilizar sigaltstack para informar al sistema de la existencia y la localización de
              la pila alternativa de señales.

       3.     Cuando  se  establece un manejador de señales usando sigaction, informar al sistema
              de que el manejador de señales debería ser ejecutado  en  la  pila  alternativa  de
              señales, especificando la bandera SA_ONSTACK.

       El  argumento  ss  se usa para especificar una nueva pila alternativa de señales, mientras
       que el argumento oss se usa para  recuperar  información  sobre  la  pila  alternativa  de
       señales  establecida  actualmente.   Si  estamos interesados en realizar sólo una de estas
       tareas, entonces el otro argumento se puede especificar como  NULL.   Cada  uno  de  estos
       argumentos es una estructura del tipo siguiente:

              typedef struct {
                  void  *ss_sp;     /* Dirección de la base de la pila */
                  int    ss_flags;  /* Banderas */
                  size_t ss_size;   /* Numero de bytes en la pila */
              } stack_t;

       Para  establecer  una nueva pila alternativa de señales, ss.ss_flags se inicializa a cero,
       ss.ss_sp y ss.ss_size especifican la dirección de comienzo y el tamaño  de  la  pila.   La
       constante  SIGSTKSZ se define para ser suficientemente grande para cubrir el requerimiento
       de tamaño habitual en una pila alternativa de señales, y la constante  MINSIGSTKSZ  define
       el tamaño mínimo requerido para ejecutar un manejador de señales.

       Para  deshabilitar  una pila existente, se especifica ss.ss_flags como SS_DISABLE. En este
       caso, los campos restantes en ss se ignoran.

       Si oss no es NULL, entonces se utiliza para devolver información sobre la pila alternativa
       de  señales  que  estaba en uso antes de la llamada a sigaltstack.  Los campos oss.ss_sp y
       oss.ss_sizedevuelven la dirección de comienzo y el tamaño de esa  pila.   El  oss.ss_flags
       puede devolver cualquiera de los siguientes valores:

       SS_ONSTACK
              El proceso está actualmente ejecutándose en la pila alternativa de señales. (Nótese
              que no es posible cambiar la  pila  alternativa  de  señales  si  el  proceso  está
              ejecutándose en ella.)

       SS_DISABLE
              La pila alternativa de señales está actualmente deshabilitada.

VALOR DEVUELTO

       sigaltstack  devuelve  0  en caso de éxito, o -1 en caso de error, con errno definido para
       indicar el error.

ERRORES

       ENOMEM El tamaño especificado para la nueva pila alternativa de señales  (ss.ss_size)  era
              menor que MINSTKSZ.

       EFAULT Ya  sea ss o oss no es NULL y apunta a un área fuera del espacio de direcciones del
              proceso.

       EPERM  Hubo un intento de cambiar la pila alternativa de señales  mientras  estaba  activa
              (p.e.: el proceso ya estaba ejecutándose en la pila alternativa de señales actual).

       EINVAL ss  no  es  NULL  y  el  campo  ss_flags  contiene  un  valor distinto de cero y de
              SS_DISABLE.

OBSERVACIONES

       El código siguiente muestra el uso de sigaltstack:

              stack_t ss;

              ss.ss_sp = malloc(SIGSTKSZ);
              if (ss.ss_sp == NULL)
                  /* Manejar error */;
              ss.ss_size = SIGSTKSZ;
              ss.ss_flags = 0;
              if (sigaltstack(&ss, NULL) == -1)
                  /* Manejar error */;

       Establecer una pila alternativa de señales es útil si un proceso  espera  agotar  su  pila
       estándar.   Esto  puede ocurrir, por ejemplo, porque la pila crezca tanto que se encuentre
       con el montículo, que crece hacia arriba, o que alcance  un  límite  establecido  por  una
       llamada  a  setrlimit(RLIMIT_STACK, &rlim).  Si la pila estándar se agota, el núcleo envía
       al proceso una señal SIGSEGV.  En estas circunstancias, la única manera de  capturar  esta
       señal es en una pila alternativa de señales.

       En  la  mayoría  de  las  arquitecturas aceptadas por Linux, las pilas crecen hacia abajo.
       sigaltstack reconoce automáticamente la dirección de crecimiento.

       Las funciones llamadas  desde  un  manejador  de  señales  que  se  ejecute  en  una  pila
       alternativa  de  señales  también usarán la pila alternativa de señales.  (Esto también es
       aplicable a cualesquiera manejadores invocados para otras señales mientras el  proceso  se
       está  ejecutando  en  la  pila  alternativa  de  señales.)   De manera diferente a la pila
       estándar, el sistema no extiende automáticamente la pila alternativa de señales.   Exceder
       el tamaño reservado de la pila alternativa de señales conlleva resultados impredecibles.

       Una llamada exitosa a execve elimina cualquier pila alternativa de señales existente.

       sigaltstack  sustituye  la  antigua llamada sigstack.  Para la compatibilidad hacia atrás,
       glibc también ofrece sigstack.  Todas las aplicaciones nuevas deberían ser  usadas  usando
       sigaltstack.

HISTORIA

       BSD  4.2  tenía  una  llamada  al  sistema  sigstack().  Usaba  una estructura ligeramente
       diferente, y como  una  desventaja  mayor,  el  invocador  debía  saber  la  dirección  de
       crecimiento de la pila.

CONFORME A

       SUSv2, SVr4, POSIX 1003.1-2001.

VÉASE TAMBIÉN

       sigaction(2), setrlimit(2), execve(2), sigsetjmp(3), siglongjmp(3), signal(7)

       Traducción     realizada     por     Jorge     Rodriguez     Garcia     (A.K.A.    Tiriel)
       <tiriel@users.sourceforge.net>