Provided by:
manpages-es_1.55-10_all 
NOMBRE
sigaltstack - definir y/u obtener el contexto de la pila de senales
SINOPSIS
#include <signal.h>
int sigaltstack(const stack_t *ss, stack_t *oss);
DESCRIPCI'ON
sigaltstack permite a un proceso definir una nueva pila alternativa de
senales y/o recuperar el estado de una pila alternativa de senales
existente. Una pila alternativa de senales se usa durante la ejecucion
de un manejador de senales si el establecimiento de ese manejador (ver
sigaction(2)) lo solicita.
La secuencia normal de eventos para usar una pila alternativa de
senales es la siguiente:
1. Reservar un area de memoria para ser utilizada por la pila
alternativa de senales.
2. Utilizar sigaltstack para informar al sistema de la existencia y
la localizacion de la pila alternativa de senales.
3. Cuando se establece un manejador de senales usando sigaction,
informar al sistema de que el manejador de senales deberia ser
ejecutado en la pila alternativa de senales, especificando la
bandera SA_ONSTACK.
El argumento ss se usa para especificar una nueva pila alternativa de
senales, mientras que el argumento oss se usa para recuperar
informacion sobre la pila alternativa de senales establecida
actualmente. Si estamos interesados en realizar solo 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; /* Direccion 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 senales, ss.ss_flags se
inicializa a cero, ss.ss_sp y ss.ss_size especifican la direccion de
comienzo y el tamano de la pila. La constante SIGSTKSZ se define para
ser suficientemente grande para cubrir el requerimiento de tamano
habitual en una pila alternativa de senales, y la constante MINSIGSTKSZ
define el tamano minimo requerido para ejecutar un manejador de
senales.
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 informacion sobre
la pila alternativa de senales que estaba en uso antes de la llamada a
sigaltstack. Los campos oss.ss_sp y oss.ss_sizedevuelven la direcci'on
de comienzo y el tama~no de esa pila. El oss.ss_flags puede devolver
cualquiera de los siguientes valores:
SS_ONSTACK
El proceso esta actualmente ejecutandose en la pila alternativa
de senales. (Notese que no es posible cambiar la pila
alternativa de senales si el proceso esta ejecutandose en ella.)
SS_DISABLE
La pila alternativa de senales esta actualmente deshabilitada.
VALOR DEVUELTO
sigaltstack devuelve 0 en caso de exito, o -1 en caso de error, con
errno definido para indicar el error.
ERRORES
ENOMEM El tamano especificado para la nueva pila alternativa de senales
(ss.ss_size) era menor que MINSTKSZ.
EFAULT Ya sea ss o oss no es NULL y apunta a un area fuera del espacio
de direcciones del proceso.
EPERM Hubo un intento de cambiar la pila alternativa de senales
mientras estaba activa (p.e.: el proceso ya estaba ejecutandose
en la pila alternativa de senales actual).
EINVAL ss no es NULL y el campo ss_flags contiene un valor distinto de
cero y de SS_DISABLE.
OBSERVACIONES
El codigo 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 senales es util si un proceso espera
agotar su pila estandar. Esto puede ocurrir, por ejemplo, porque la
pila crezca tanto que se encuentre con el monticulo, que crece hacia
arriba, o que alcance un limite establecido por una llamada a
setrlimit(RLIMIT_STACK, &rlim). Si la pila estandar se agota, el
nucleo envia al proceso una senal SIGSEGV. En estas circunstancias, la
unica manera de capturar esta senal es en una pila alternativa de
senales.
En la mayoria de las arquitecturas aceptadas por Linux, las pilas
crecen hacia abajo. sigaltstack reconoce automaticamente la direccion
de crecimiento.
Las funciones llamadas desde un manejador de senales que se ejecute en
una pila alternativa de senales tambien usaran la pila alternativa de
senales. (Esto tambien es aplicable a cualesquiera manejadores
invocados para otras senales mientras el proceso se esta ejecutando en
la pila alternativa de senales.) De manera diferente a la pila
estandar, el sistema no extiende automaticamente la pila alternativa de
senales. Exceder el tamano reservado de la pila alternativa de senales
conlleva resultados impredecibles.
Una llamada exitosa a execve elimina cualquier pila alternativa de
senales existente.
sigaltstack sustituye la antigua llamada sigstack. Para la
compatibilidad hacia atras, glibc tambien ofrece sigstack. Todas las
aplicaciones nuevas deberian ser usadas usando sigaltstack.
HISTORIA
BSD 4.2 tenia una llamada al sistema sigstack(). Usaba una estructura
ligeramente diferente, y como una desventaja mayor, el invocador debia
saber la direccion de crecimiento de la pila.
CONFORME A
SUSv2, SVr4, POSIX 1003.1-2001.
V'EASE TAMBI'EN
sigaction(2), setrlimit(2), execve(2), sigsetjmp(3), siglongjmp(3),
signal(7)
Traduccion realizada por Jorge Rodriguez Garcia (A.K.A. Tiriel)
<tiriel@users.sourceforge.net>