File: sigaltstack.2

package info (click to toggle)
manpages-es 1.55-4
  • links: PTS
  • area: main
  • in suites: etch, etch-m68k
  • size: 7,472 kB
  • ctags: 6
  • sloc: sh: 1,349; makefile: 63
file content (192 lines) | stat: -rw-r--r-- 7,129 bytes parent folder | download | duplicates (4)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
.\" Copyright (c) 2001, Michael Kerrisk (mtk16@ext.canterbury.ac.nz)
.\"
.\" Permission is granted to make and distribute verbatim copies of this
.\" manual provided the copyright notice and this permission notice are
.\" preserved on all copies.
.\"
.\" Permission is granted to copy and distribute modified versions of this
.\" manual under the conditions for verbatim copying, provided that the
.\" entire resulting derived work is distributed under the terms of a
.\" permission notice identical to this one
.\"
.\" Since the Linux kernel and libraries are constantly changing, this
.\" manual page may be incorrect or out-of-date.  The author(s) assume no
.\" responsibility for errors or omissions, or for damages resulting from
.\" the use of the information contained herein.
.\"
.\" Formatted or processed versions of this manual, if unaccompanied by
.\" the source, must acknowledge the copyright and authors of this work.
.\"
.\" aeb, various minor fixes
.\" 
.\" Translated by Jorge Rodriguez Garcia (A.K.A. Tiriel) <tiriel@users.sourceforge.net>
.\" Revisado por Miguel Pérez Ibars el 31 mayo 2005
.\"
.TH SIGALTSTACK 2 "27 septiembre 2001" "Linux 2.4" "Manual del Programador de Linux"
.SH NOMBRE
sigaltstack - definir y/u obtener el contexto de la pila de señales
.SH SINOPSIS
.B #include <signal.h>
.sp
.BI "int sigaltstack(const stack_t *" ss ", stack_t *" oss );
.SH DESCRIPCIÓN
\fBsigaltstack\fP 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
.BR sigaction (2))
lo solicita.

La secuencia normal de eventos para usar una pila alternativa de señales 
es la siguiente:
.TP
1.
Reservar un área de memoria para ser utilizada por la pila alternativa de
señales.
.TP
2.
Utilizar \fBsigaltstack\fP para informar al sistema de la existencia y
la localización de la pila alternativa de señales.
.TP
3.
Cuando se establece un manejador de señales usando \fBsigaction\fP,
informar al sistema de que el manejador de señales debería ser ejecutado
en la pila alternativa de señales, especificando la bandera \fBSA_ONSTACK\fP.
.P
El argumento \fIss\fP se usa para especificar una nueva
pila alternativa de señales, mientras que el argumento \fIoss\fP
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:
.sp
.RS
.nf
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;
.fi
.RE

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

Para deshabilitar una pila existente, se especifica \fIss.ss_flags\fP
como \fBSS_DISABLE\fP. En este caso, los campos restantes en
\fIss\fP se ignoran.

Si \fIoss\fP 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 \fBsigaltstack\fP.
Los campos \fIoss.ss_sp\fP y \fIoss.ss_size\f devuelven la dirección
de comienzo y el tamaño de esa pila.
El \fIoss.ss_flags\fP puede devolver cualquiera de los siguientes valores:

.TP
.B 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.)
.TP
.B SS_DISABLE
La pila alternativa de señales está actualmente deshabilitada.

.SH "VALOR DEVUELTO"
\fBsigaltstack\fP devuelve 0 en caso de éxito, o \-1 en caso de error, con
\fIerrno\fP definido para indicar el error.

.SH ERRORES
.TP
.B ENOMEM
El tamaño especificado para la nueva pila alternativa de señales 
(\fIss.ss_size\fP) era menor que \fBMINSTKSZ\fP.
.TP
.B EFAULT
Ya sea \fIss\fP o \fIoss\fP no es NULL y apunta a un área
fuera del espacio de direcciones del proceso.
.TP
.B 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).
.TP
.B EINVAL
\fIss\fP no es NULL y el campo \fPss_flags\fP contiene
un valor distinto de cero y de SS_DISABLE.

.SH OBSERVACIONES
El código siguiente muestra el uso de \fBsigaltstack\fP:

.RS
.nf
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 */;
.fi
.RE
.P
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 \fBsetrlimit(RLIMIT_STACK, &rlim)\fP.
Si la pila estándar se agota, el núcleo envía al proceso
una señal \fBSIGSEGV\fP.
En estas circunstancias, la única manera de capturar esta señal
es en una pila alternativa de señales.
.P
En la mayoría de las arquitecturas aceptadas por Linux, las pilas
crecen hacia abajo. \fBsigaltstack\fP reconoce automáticamente
la dirección de crecimiento.
.P
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.
.P
Una llamada exitosa a \fBexecve\fP elimina cualquier pila alternativa de
señales existente.
.P
\fBsigaltstack\fP sustituye la antigua llamada \fBsigstack\fP.
Para la compatibilidad hacia atrás, glibc también ofrece \fBsigstack\fP.
Todas las aplicaciones nuevas deberían ser usadas usando \fBsigaltstack\fB.

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

.SH "CONFORME A"
SUSv2, SVr4, POSIX 1003.1-2001.

.SH "VÉASE TAMBIÉN"
.BR sigaction (2),
.BR setrlimit (2),
.BR execve (2),
.BR sigsetjmp (3),
.BR siglongjmp (3),
.BR signal (7)

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