bionic (2) sigaltstack.2.gz

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>