Provided by: manpages-es_1.55-8_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 direccin
       de comienzo y el tamao 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>