OSDN Git Service

f727079504673f7a2717eb771ae9c8a8cadd8f8d
[uclinux-h8/uClibc.git] / include / signal.h
1 /* Copyright (C) 1991-2003, 2004 Free Software Foundation, Inc.
2    This file is part of the GNU C Library.
3
4    The GNU C Library is free software; you can redistribute it and/or
5    modify it under the terms of the GNU Lesser General Public
6    License as published by the Free Software Foundation; either
7    version 2.1 of the License, or (at your option) any later version.
8
9    The GNU C Library is distributed in the hope that it will be useful,
10    but WITHOUT ANY WARRANTY; without even the implied warranty of
11    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
12    Lesser General Public License for more details.
13
14    You should have received a copy of the GNU Lesser General Public
15    License along with the GNU C Library; if not, write to the Free
16    Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA
17    02111-1307 USA.  */
18
19 /*
20  *      ISO C99 Standard: 7.14 Signal handling <signal.h>
21  */
22
23 #ifndef _SIGNAL_H
24
25 #if !defined __need_sig_atomic_t && !defined __need_sigset_t
26 # define _SIGNAL_H
27 #endif
28
29 #include <features.h>
30
31 __BEGIN_DECLS
32
33 #include <bits/sigset.h>                /* __sigset_t, __sig_atomic_t.  */
34
35 /* An integral type that can be modified atomically, without the
36    possibility of a signal arriving in the middle of the operation.  */
37 #if defined __need_sig_atomic_t || defined _SIGNAL_H
38 # ifndef __sig_atomic_t_defined
39 #  define __sig_atomic_t_defined
40 __BEGIN_NAMESPACE_STD
41 typedef __sig_atomic_t sig_atomic_t;
42 __END_NAMESPACE_STD
43 # endif
44 # undef __need_sig_atomic_t
45 #endif
46
47 #if defined __need_sigset_t || (defined _SIGNAL_H && defined __USE_POSIX)
48 # ifndef __sigset_t_defined
49 #  define __sigset_t_defined
50 typedef __sigset_t sigset_t;
51 # endif
52 # undef __need_sigset_t
53 #endif
54
55 #ifdef _SIGNAL_H
56
57 #include <bits/types.h>
58 #include <bits/signum.h>
59
60 /* Fake signal functions.  */
61 #define SIG_ERR    ((__sighandler_t) -1) /* Error return.  */
62 #define SIG_DFL    ((__sighandler_t) 0)  /* Default action.  */
63 #define SIG_IGN    ((__sighandler_t) 1)  /* Ignore signal.  */
64 #ifdef __USE_UNIX98
65 # define SIG_HOLD  ((__sighandler_t) 2)  /* Add signal to hold mask.  */
66 #endif
67 /* Biggest signal number + 1 (including real-time signals).  */
68 #ifndef _NSIG /* if arch has not defined it in bits/signum.h... */
69 # define _NSIG 65
70 #endif
71 #ifdef __USE_MISC
72 # define NSIG _NSIG
73 #endif
74 /* Real-time signal range */
75 #define SIGRTMIN   (__libc_current_sigrtmin())
76 #define SIGRTMAX   (__libc_current_sigrtmax())
77 /* These are the hard limits of the kernel.  These values should not be
78    used directly at user level.  */
79 #ifndef __SIGRTMIN /* if arch has not defined it in bits/signum.h... */
80 # define __SIGRTMIN 32
81 #endif
82 #define __SIGRTMAX (_NSIG - 1)
83
84
85 #if defined __USE_XOPEN || defined __USE_XOPEN2K
86 # ifndef __pid_t_defined
87 typedef __pid_t pid_t;
88 #  define __pid_t_defined
89 # endif
90 # ifndef __uid_t_defined
91 typedef __uid_t uid_t;
92 #  define __uid_t_defined
93 # endif
94 #endif  /* Unix98 */
95
96
97 /* Type of a signal handler.  */
98 typedef void (*__sighandler_t) (int);
99 #if defined __UCLIBC_HAS_OBSOLETE_SYSV_SIGNAL__
100 /* The X/Open definition of `signal' specifies the SVID semantic.  Use
101    the additional function `sysv_signal' when X/Open compatibility is
102    requested.  */
103 extern __sighandler_t __sysv_signal (int __sig, __sighandler_t __handler)
104      __THROW;
105 # ifdef __USE_GNU
106 extern __sighandler_t sysv_signal (int __sig, __sighandler_t __handler)
107      __THROW;
108 # endif
109 #endif /* __UCLIBC_HAS_OBSOLETE_SYSV_SIGNAL__ */
110
111 /* Set the handler for the signal SIG to HANDLER, returning the old
112    handler, or SIG_ERR on error.
113    By default `signal' has the BSD semantic.  */
114 __BEGIN_NAMESPACE_STD
115 #if defined __USE_BSD || !defined __UCLIBC_HAS_OBSOLETE_SYSV_SIGNAL__
116 extern __sighandler_t signal (int __sig, __sighandler_t __handler)
117      __THROW;
118 libc_hidden_proto(signal)
119 #else
120 /* Make sure the used `signal' implementation is the SVID version. */
121 # ifdef __REDIRECT_NTH
122 extern __sighandler_t __REDIRECT_NTH (signal,
123                                       (int __sig, __sighandler_t __handler),
124                                       __sysv_signal);
125 # else
126 #  define signal __sysv_signal
127 # endif
128 #endif
129 __END_NAMESPACE_STD
130
131 #if defined __USE_XOPEN && defined __UCLIBC_SUSV3_LEGACY__
132 /* The X/Open definition of `signal' conflicts with the BSD version.
133    So they defined another function `bsd_signal'.  */
134 extern __sighandler_t bsd_signal (int __sig, __sighandler_t __handler)
135      __THROW;
136 #endif
137
138 /* Send signal SIG to process number PID.  If PID is zero,
139    send SIG to all processes in the current process's process group.
140    If PID is < -1, send SIG to all processes in process group - PID.  */
141 #ifdef __USE_POSIX
142 extern int kill (__pid_t __pid, int __sig) __THROW;
143 libc_hidden_proto(kill)
144 #endif
145
146 #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
147 /* Send SIG to all processes in process group PGRP.
148    If PGRP is zero, send SIG to all processes in
149    the current process's process group.  */
150 extern int killpg (__pid_t __pgrp, int __sig) __THROW;
151 #endif
152
153 __BEGIN_NAMESPACE_STD
154 /* Raise signal SIG, i.e., send SIG to yourself.  */
155 extern int raise (int __sig) __THROW;
156 libc_hidden_proto(raise)
157 __END_NAMESPACE_STD
158
159 #ifdef __USE_SVID
160 /* SVID names for the same things.  */
161 extern __sighandler_t ssignal (int __sig, __sighandler_t __handler)
162      __THROW;
163 extern int gsignal (int __sig) __THROW;
164 #endif /* Use SVID.  */
165
166 #ifdef __USE_MISC
167 /* Print a message describing the meaning of the given signal number.  */
168 extern void psignal (int __sig, __const char *__s);
169 #endif /* Use misc.  */
170
171
172 /* The `sigpause' function has two different interfaces.  The original
173    BSD definition defines the argument as a mask of the signal, while
174    the more modern interface in X/Open defines it as the signal
175    number.  We go with the BSD version unless the user explicitly
176    selects the X/Open version.
177
178    This function is a cancellation point and therefore not marked with
179    __THROW.  */
180 extern int __sigpause (int __sig_or_mask, int __is_sig);
181 libc_hidden_proto(__sigpause)
182
183 #ifdef __FAVOR_BSD
184 /* Set the mask of blocked signals to MASK,
185    wait for a signal to arrive, and then restore the mask.  */
186 extern int sigpause (int __mask) __THROW __attribute_deprecated__;
187 libc_hidden_proto(sigpause)
188 # define sigpause(mask) __sigpause ((mask), 0)
189 #else
190 # ifdef __USE_XOPEN
191 /* Remove a signal from the signal mask and suspend the process.  */
192 #  define sigpause(sig) __sigpause ((sig), 1)
193 # endif
194 #endif
195
196
197 #ifdef __USE_BSD
198 /* None of the following functions should be used anymore.  They are here
199    only for compatibility.  A single word (`int') is not guaranteed to be
200    enough to hold a complete signal mask and therefore these functions
201    simply do not work in many situations.  Use `sigprocmask' instead.  */
202
203 /* Compute mask for signal SIG.  */
204 # define sigmask(sig)   __sigmask(sig)
205
206 /* Block signals in MASK, returning the old mask.  */
207 extern int sigblock (int __mask) __THROW;
208 /* collides with libc_hidden_proto: __attribute_deprecated__; */
209 libc_hidden_proto(sigblock)
210
211 /* Set the mask of blocked signals to MASK, returning the old mask.  */
212 extern int sigsetmask (int __mask) __THROW;
213 /* collides with libc_hidden_proto: __attribute_deprecated__; */
214 libc_hidden_proto(sigsetmask)
215
216 /* Return currently selected signal mask.  */
217 extern int siggetmask (void) __THROW __attribute_deprecated__;
218 #endif /* Use BSD.  */
219
220
221 #ifdef __USE_GNU
222 typedef __sighandler_t sighandler_t;
223 #endif
224
225 /* 4.4 BSD uses the name `sig_t' for this.  */
226 #ifdef __USE_BSD
227 typedef __sighandler_t sig_t;
228 #endif
229
230 #ifdef __USE_POSIX
231
232 # ifdef __USE_POSIX199309
233 /* We need `struct timespec' later on.  */
234 #  define __need_timespec
235 #  include <time.h>
236
237 /* Get the `siginfo_t' type plus the needed symbols.  */
238 #  include <bits/siginfo.h>
239 # endif
240
241 /* Clear all signals from SET.  */
242 extern int sigemptyset (sigset_t *__set) __THROW __nonnull ((1));
243 libc_hidden_proto(sigemptyset)
244
245 /* Set all signals in SET.  */
246 extern int sigfillset (sigset_t *__set) __THROW __nonnull ((1));
247 libc_hidden_proto(sigfillset)
248
249 /* Add SIGNO to SET.  */
250 extern int sigaddset (sigset_t *__set, int __signo) __THROW __nonnull ((1));
251 libc_hidden_proto(sigaddset)
252
253 /* Remove SIGNO from SET.  */
254 extern int sigdelset (sigset_t *__set, int __signo) __THROW __nonnull ((1));
255 libc_hidden_proto(sigdelset)
256
257 /* Return 1 if SIGNO is in SET, 0 if not.  */
258 extern int sigismember (__const sigset_t *__set, int __signo)
259      __THROW __nonnull ((1));
260
261 # ifdef __USE_GNU
262 /* Return non-empty value is SET is not empty.  */
263 extern int sigisemptyset (__const sigset_t *__set) __THROW __nonnull ((1));
264
265 /* Build new signal set by combining the two inputs set using logical AND.  */
266 extern int sigandset (sigset_t *__set, __const sigset_t *__left,
267                       __const sigset_t *__right) __THROW __nonnull ((1, 2, 3));
268
269 /* Build new signal set by combining the two inputs set using logical OR.  */
270 extern int sigorset (sigset_t *__set, __const sigset_t *__left,
271                      __const sigset_t *__right) __THROW __nonnull ((1, 2, 3));
272 # endif /* GNU */
273
274 /* Get the system-specific definitions of `struct sigaction'
275    and the `SA_*' and `SIG_*'. constants.  */
276 # include <bits/sigaction.h>
277
278 /* Get and/or change the set of blocked signals.  */
279 extern int sigprocmask (int __how, __const sigset_t *__restrict __set,
280                         sigset_t *__restrict __oset) __THROW;
281 libc_hidden_proto(sigprocmask)
282
283 /* Change the set of blocked signals to SET,
284    wait until a signal arrives, and restore the set of blocked signals.
285
286    This function is a cancellation point and therefore not marked with
287    __THROW.  */
288 extern int sigsuspend (__const sigset_t *__set) __nonnull ((1));
289 libc_hidden_proto(sigsuspend)
290
291 /* Get and/or set the action for signal SIG.  */
292 extern int sigaction (int __sig, __const struct sigaction *__restrict __act,
293                       struct sigaction *__restrict __oact) __THROW;
294 libc_hidden_proto(sigaction)
295
296 /* Put in SET all signals that are blocked and waiting to be delivered.  */
297 extern int sigpending (sigset_t *__set) __THROW __nonnull ((1));
298
299
300 /* Select any of pending signals from SET or wait for any to arrive.
301
302    This function is a cancellation point and therefore not marked with
303    __THROW.  */
304 extern int sigwait (__const sigset_t *__restrict __set, int *__restrict __sig)
305      __nonnull ((1, 2));
306
307 # if defined __USE_POSIX199309 && defined __UCLIBC_HAS_REALTIME__
308 /* Select any of pending signals from SET and place information in INFO.
309
310    This function is a cancellation point and therefore not marked with
311    __THROW.  */
312 extern int sigwaitinfo (__const sigset_t *__restrict __set,
313                         siginfo_t *__restrict __info) __nonnull ((1));
314 libc_hidden_proto(sigwaitinfo)
315
316 /* Select any of pending signals from SET and place information in INFO.
317    Wait the time specified by TIMEOUT if no signal is pending.
318
319    This function is a cancellation point and therefore not marked with
320    __THROW.  */
321 extern int sigtimedwait (__const sigset_t *__restrict __set,
322                          siginfo_t *__restrict __info,
323                          __const struct timespec *__restrict __timeout)
324      __nonnull ((1));
325 libc_hidden_proto(sigtimedwait)
326
327 /* Send signal SIG to the process PID.  Associate data in VAL with the
328    signal.  */
329 extern int sigqueue (__pid_t __pid, int __sig, __const union sigval __val)
330      __THROW;
331 # endif /* Use POSIX 199306.  */
332
333 #endif /* Use POSIX.  */
334
335 #ifdef __USE_BSD
336
337 # ifdef __UCLIBC_HAS_SYS_SIGLIST__
338 /* Names of the signals.  This variable exists only for compatibility.
339    Use `strsignal' instead (see <string.h>).  */
340 #  define _sys_siglist sys_siglist
341 extern __const char *__const sys_siglist[_NSIG];
342 # endif
343
344 /* Structure passed to `sigvec'.  */
345 struct sigvec
346   {
347     __sighandler_t sv_handler;  /* Signal handler.  */
348     int sv_mask;                /* Mask of signals to be blocked.  */
349
350     int sv_flags;               /* Flags (see below).  */
351 # define sv_onstack     sv_flags /* 4.2 BSD compatibility.  */
352   };
353
354 /* Bits in `sv_flags'.  */
355 # define SV_ONSTACK     (1 << 0)/* Take the signal on the signal stack.  */
356 # define SV_INTERRUPT   (1 << 1)/* Do not restart system calls.  */
357 # define SV_RESETHAND   (1 << 2)/* Reset handler to SIG_DFL on receipt.  */
358
359
360 /* If VEC is non-NULL, set the handler for SIG to the `sv_handler' member
361    of VEC.  The signals in `sv_mask' will be blocked while the handler runs.
362    If the SV_RESETHAND bit is set in `sv_flags', the handler for SIG will be
363    reset to SIG_DFL before `sv_handler' is entered.  If OVEC is non-NULL,
364    it is filled in with the old information for SIG.  */
365 extern int sigvec (int __sig, __const struct sigvec *__vec,
366                    struct sigvec *__ovec) __THROW;
367
368
369 /* Get machine-dependent `struct sigcontext' and signal subcodes.  */
370 # include <bits/sigcontext.h>
371
372 /* Restore the state saved in SCP.  */
373 extern int sigreturn (struct sigcontext *__scp) __THROW;
374
375 #endif /*  use BSD.  */
376
377
378 #if defined __USE_BSD || defined __USE_XOPEN_EXTENDED
379
380 /* If INTERRUPT is nonzero, make signal SIG interrupt system calls
381    (causing them to fail with EINTR); if INTERRUPT is zero, make system
382    calls be restarted after signal SIG.  */
383 extern int siginterrupt (int __sig, int __interrupt) __THROW;
384
385 # include <bits/sigstack.h>
386 # ifdef __USE_XOPEN
387 /* This will define `ucontext_t' and `mcontext_t'.  */
388 #  include <ucontext.h>
389 # endif
390
391 /* Run signals handlers on the stack specified by SS (if not NULL).
392    If OSS is not NULL, it is filled in with the old signal stack status.
393    This interface is obsolete and on many platform not implemented.  */
394 extern int sigstack (struct sigstack *__ss, struct sigstack *__oss)
395      __THROW __attribute_deprecated__;
396
397 /* Alternate signal handler stack interface.
398    This interface should always be preferred over `sigstack'.  */
399 extern int sigaltstack (__const struct sigaltstack *__restrict __ss,
400                         struct sigaltstack *__restrict __oss) __THROW;
401
402 #endif /* use BSD or X/Open Unix.  */
403
404 #if defined __USE_XOPEN_EXTENDED && defined __UCLIBC_HAS_OBSOLETE_BSD_SIGNAL__
405 /* Simplified interface for signal management.  */
406
407 /* Add SIG to the calling process' signal mask.  */
408 extern int sighold (int __sig) __THROW;
409
410 /* Remove SIG from the calling process' signal mask.  */
411 extern int sigrelse (int __sig) __THROW;
412
413 /* Set the disposition of SIG to SIG_IGN.  */
414 extern int sigignore (int __sig) __THROW;
415
416 /* Set the disposition of SIG.  */
417 extern __sighandler_t sigset (int __sig, __sighandler_t __disp) __THROW;
418 #endif
419
420 #if defined __UCLIBC_HAS_THREADS__ && (defined __USE_POSIX199506 || defined __USE_UNIX98)
421 /* Some of the functions for handling signals in threaded programs must
422    be defined here.  */
423 # include <bits/pthreadtypes.h>
424 # include <bits/sigthread.h>
425 #endif
426
427 /* The following functions are used internally in the C library and in
428    other code which need deep insights.  */
429
430 /* Return number of available real-time signal with highest priority.  */
431 extern int __libc_current_sigrtmin (void) __THROW;
432 /* Return number of available real-time signal with lowest priority.  */
433 extern int __libc_current_sigrtmax (void) __THROW;
434
435 #endif /* signal.h  */
436
437 __END_DECLS
438
439 #endif /* not signal.h */