X-Git-Url: http://git.osdn.net/view?a=blobdiff_plain;f=include%2Fsignal.h;h=be24cf366292f395fc817b0f33aae3405e485a19;hb=HEAD;hp=9daf0c07cf4131ff9f9aaa69af575623f37ea4d8;hpb=64bc6412188b141c010ac3b8e813b837dd991e80;p=uclinux-h8%2FuClibc.git diff --git a/include/signal.h b/include/signal.h index 9daf0c07c..be24cf366 100644 --- a/include/signal.h +++ b/include/signal.h @@ -1,166 +1,505 @@ -/* Copyright (C) 1991, 1992, 1993, 1994 Free Software Foundation, Inc. -This file is part of the GNU C Library. +/* Copyright (C) 1991-2003, 2004, 2007, 2009 Free Software Foundation, Inc. + This file is part of the GNU C Library. -The GNU C Library is free software; you can redistribute it and/or -modify it under the terms of the GNU Library General Public License as -published by the Free Software Foundation; either version 2 of the -License, or (at your option) any later version. + The GNU C Library is free software; you can redistribute it and/or + modify it under the terms of the GNU Lesser General Public + License as published by the Free Software Foundation; either + version 2.1 of the License, or (at your option) any later version. -The GNU C Library is distributed in the hope that it will be useful, -but WITHOUT ANY WARRANTY; without even the implied warranty of -MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU -Library General Public License for more details. + The GNU C Library is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU + Lesser General Public License for more details. -You should have received a copy of the GNU Library General Public -License along with the GNU C Library; see the file COPYING.LIB. If -not, write to the, 1992 Free Software Foundation, Inc., 675 Mass Ave, -Cambridge, MA 02139, USA. */ + You should have received a copy of the GNU Lesser General Public + License along with the GNU C Library; if not, see + . */ /* - * ANSI Standard: 4.7 SIGNAL HANDLING + * ISO C99 Standard: 7.14 Signal handling */ -#ifndef _SIGNAL_H -#define _SIGNAL_H +#ifndef _SIGNAL_H + +#if !defined __need_sig_atomic_t && !defined __need_sigset_t +# define _SIGNAL_H +#endif #include -#include -#include -#ifndef SIGCLD -#define SIGCLD SIGCHLD -#endif +__BEGIN_DECLS -/* SVR4 */ -#ifndef SA_RESETHAND -#define SA_RESETHAND SA_ONESHOT +#include /* __sigset_t, __sig_atomic_t. */ + +/* An integral type that can be modified atomically, without the + possibility of a signal arriving in the middle of the operation. */ +#if defined __need_sig_atomic_t || defined _SIGNAL_H +# ifndef __sig_atomic_t_defined +# define __sig_atomic_t_defined +__BEGIN_NAMESPACE_STD +typedef __sig_atomic_t sig_atomic_t; +__END_NAMESPACE_STD +# endif +# undef __need_sig_atomic_t #endif -/* SVR4 */ -#ifndef SA_NODEFER -#define SA_NODEFER SA_NOMASK +#if defined __need_sigset_t || (defined _SIGNAL_H && defined __USE_POSIX) +# ifndef __sigset_t_defined +# define __sigset_t_defined +typedef __sigset_t sigset_t; +# endif +# undef __need_sigset_t #endif -typedef int sig_atomic_t; +#ifdef _SIGNAL_H -typedef __sighandler_t SignalHandler; +#include +#include -#ifndef BADSIG -#define BADSIG SIG_ERR +/* Fake signal functions. */ +#define SIG_ERR ((__sighandler_t) -1) /* Error return. */ +#define SIG_DFL ((__sighandler_t) 0) /* Default action. */ +#define SIG_IGN ((__sighandler_t) 1) /* Ignore signal. */ +#ifdef __USE_UNIX98 +# define SIG_HOLD ((__sighandler_t) 2) /* Add signal to hold mask. */ +#endif +/* Biggest signal number + 1 (including real-time signals). */ +#ifndef _NSIG /* if arch has not defined it in bits/signum.h... */ +# define _NSIG 65 #endif +#ifdef __USE_MISC +# define NSIG _NSIG +#endif +/* Real-time signal range */ +#define SIGRTMIN (__libc_current_sigrtmin()) +#define SIGRTMAX (__libc_current_sigrtmax()) +/* These are the hard limits of the kernel. These values should not be + used directly at user level. */ +#ifndef __SIGRTMIN /* if arch has not defined it in bits/signum.h... */ +# define __SIGRTMIN 32 +#endif +#define __SIGRTMAX (_NSIG - 1) -/* The Interviews version also has these ... */ -#define SignalBad ((SignalHandler)-1) -#define SignalDefault ((SignalHandler)0) -#define SignalIgnore ((SignalHandler)1) +#if defined __USE_XOPEN || defined __USE_XOPEN2K +# ifndef __pid_t_defined +typedef __pid_t pid_t; +# define __pid_t_defined +# endif +#endif +#ifdef __USE_XOPEN +# ifndef __uid_t_defined +typedef __uid_t uid_t; +# define __uid_t_defined +# endif +#endif /* Unix98 */ + +#if defined __USE_POSIX199309 && defined __UCLIBC_HAS_REALTIME__ +/* We need `struct timespec' later on. */ +# define __need_timespec +# include +#endif -__BEGIN_DECLS +#if defined __USE_POSIX199309 || defined __USE_XOPEN_EXTENDED +/* Get the `siginfo_t' type plus the needed symbols. */ +# include +#endif -extern __const char * __const sys_siglist[]; -extern __const char * __const _sys_siglist[]; - -extern __sighandler_t - signal __P ((int __sig, __sighandler_t)); -extern __sighandler_t - __signal __P ((int __sig, __sighandler_t, int flags)); -extern int raise __P ((int __sig)); -extern int __kill __P ((pid_t __pid, int __sig)); -extern int kill __P ((pid_t __pid, int __sig)); -extern int killpg __P ((int __pgrp, int __sig)); -extern int sigaddset __P ((sigset_t *__mask, int __sig)); -extern int sigdelset __P ((sigset_t *__mask, int __sig)); -extern int sigemptyset __P ((sigset_t *__mask)); -extern int sigfillset __P ((sigset_t *__mask)); -extern int sigismember __P ((__const sigset_t *__mask, int __sig)); -extern int sigpending __P ((sigset_t *__set)); - -extern int __sigprocmask __P ((int __how, __const sigset_t *__set, - sigset_t *__oldset)); -extern int sigprocmask __P ((int __how, __const sigset_t *__set, - sigset_t *__oldset)); - -extern int sigsuspend __P ((__const sigset_t *sigmask)); - -extern int __sigaction __P ((int __sig, struct sigaction *__act, - struct sigaction *__oldact)); -extern int sigaction __P ((int __sig, struct sigaction *__act, - struct sigaction *__oldact)); - -#define __sigemptyset(set) ((*(set) = 0L), 0) -#define __sigfillset(set) ((*(set) = -1L), 0) -#define __sigaddset(set, sig) ((*(set) |= __sigmask (sig)), 0) -#define __sigdelset(set, sig) ((*(set) &= ~__sigmask (sig)), 0) -#define __sigismember(set, sig) ((*(set) & __sigmask (sig)) ? 1 : 0) - - -#if 1 -#define sigemptyset __sigemptyset -#define sigfillset __sigfillset - -/* We don't do that any more since it causes problems due to - * "sig" > _NSIG and "sig" < 1. It isn't worth the touble to make - * them inline and static. Use __sigxxxxx if you want speed with - * correct "sig". - */ -#if 1 -#define sigaddset __sigaddset -#define sigdelset __sigdelset -#define sigismember __sigismember + +/* Type of a signal handler. */ +typedef void (*__sighandler_t) (int); + +#if defined __UCLIBC_HAS_OBSOLETE_SYSV_SIGNAL__ +/* The X/Open definition of `signal' specifies the SVID semantic. Use + the additional function `sysv_signal' when X/Open compatibility is + requested. */ +extern __sighandler_t __sysv_signal (int __sig, __sighandler_t __handler) + __THROW; +# ifdef __USE_GNU +extern __sighandler_t sysv_signal (int __sig, __sighandler_t __handler) + __THROW; +# endif +#endif /* __UCLIBC_HAS_OBSOLETE_SYSV_SIGNAL__ */ + +/* Set the handler for the signal SIG to HANDLER, returning the old + handler, or SIG_ERR on error. + By default `signal' has the BSD semantic. */ +__BEGIN_NAMESPACE_STD +#if defined __USE_BSD || !defined __UCLIBC_HAS_OBSOLETE_SYSV_SIGNAL__ +extern __sighandler_t signal (int __sig, __sighandler_t __handler) + __THROW; +libc_hidden_proto(signal) +#else +/* Make sure the used `signal' implementation is the SVID version. */ +# ifdef __REDIRECT_NTH +extern __sighandler_t __REDIRECT_NTH (signal, + (int __sig, __sighandler_t __handler), + __sysv_signal); +# else +# define signal __sysv_signal +# endif #endif +__END_NAMESPACE_STD +#if defined __USE_XOPEN && defined __UCLIBC_SUSV3_LEGACY__ +/* The X/Open definition of `signal' conflicts with the BSD version. + So they defined another function `bsd_signal'. */ +extern __sighandler_t bsd_signal (int __sig, __sighandler_t __handler) + __THROW; #endif +/* Send signal SIG to process number PID. If PID is zero, + send SIG to all processes in the current process's process group. + If PID is < -1, send SIG to all processes in process group - PID. */ +#ifdef __USE_POSIX +extern int kill (__pid_t __pid, int __sig) __THROW; +libc_hidden_proto(kill) +#endif -/* Return a mask that includes SIG only. */ -#define __sigmask(sig) (1 << ((sig) - 1)) +#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED +/* Send SIG to all processes in process group PGRP. + If PGRP is zero, send SIG to all processes in + the current process's process group. */ +extern int killpg (__pid_t __pgrp, int __sig) __THROW; +#endif -extern int __sigsetmask __P ((int __mask)); -extern int __siggetmask __P ((void)); -extern int __sigblock __P ((int __mask)); -extern int __sigpause __P ((int __mask)); +__BEGIN_NAMESPACE_STD +/* Raise signal SIG, i.e., send SIG to yourself. */ +extern int raise (int __sig) __THROW; +libc_hidden_proto(raise) +__END_NAMESPACE_STD -#ifdef __USE_SVID +#if 0 /*def __USE_SVID*/ /* SVID names for the same things. */ -extern __sighandler_t ssignal __P ((int __sig, __sighandler_t __handler)); -extern int gsignal __P ((int __sig)); - +extern __sighandler_t ssignal (int __sig, __sighandler_t __handler) + __THROW; +extern int gsignal (int __sig) __THROW; #endif /* Use SVID. */ - -/* BSD */ + +/* glibc guards the next two wrong with __USE_XOPEN2K */ +#if defined __USE_MISC || defined __USE_XOPEN2K8 +/* Print a message describing the meaning of the given signal number. */ +extern void psignal (int __sig, const char *__s); +#endif /* Use misc or POSIX 2008. */ + +#if 0 /*def __USE_XOPEN2K8*/ +/* Print a message describing the meaning of the given signal information. */ +extern void psiginfo (const siginfo_t *__pinfo, const char *__s); +#endif /* POSIX 2008. */ + +#ifdef __UCLIBC_SUSV4_LEGACY__ +/* The `sigpause' function has two different interfaces. The original + BSD definition defines the argument as a mask of the signal, while + the more modern interface in X/Open defines it as the signal + number. We go with the BSD version unless the user explicitly + selects the X/Open version. + + This function is a cancellation point and therefore not marked with + __THROW. */ +/*extern int __sigpause (int __sig_or_mask, int __is_sig);*/ + +#ifdef __FAVOR_BSD +/* Set the mask of blocked signals to MASK, + wait for a signal to arrive, and then restore the mask. */ +/*extern int sigpause (int __mask) __THROW __attribute_deprecated__; +# define sigpause(mask) __sigpause ((mask), 0)*/ +/* uClibc note: BSD sigpause is available as __bsd_sigpause. + * It is intentionally not prototyped */ +#else +# ifdef __USE_XOPEN +/* Remove a signal from the signal mask and suspend the process. */ +extern int sigpause(int __sig); +/*# define sigpause(sig) __sigpause ((sig), 1)*/ +# endif +#endif +#endif /* __UCLIBC_SUSV4_LEGACY__ */ + +#if 0 /*def __USE_BSD*/ +/* None of the following functions should be used anymore. They are here + only for compatibility. A single word (`int') is not guaranteed to be + enough to hold a complete signal mask and therefore these functions + simply do not work in many situations. Use `sigprocmask' instead. */ + +/* Compute mask for signal SIG. */ +# define sigmask(sig) __sigmask(sig) + +/* Block signals in MASK, returning the old mask. */ +extern int sigblock (int __mask) __THROW __attribute_deprecated__; + +/* Set the mask of blocked signals to MASK, returning the old mask. */ +extern int sigsetmask (int __mask) __THROW __attribute_deprecated__; + +/* Return currently selected signal mask. */ +extern int siggetmask (void) __THROW __attribute_deprecated__; +#endif /* Use BSD. */ + + +#ifdef __USE_GNU +typedef __sighandler_t sighandler_t; +#endif + +/* 4.4 BSD uses the name `sig_t' for this. */ #ifdef __USE_BSD -#define sigmask __sigmask +typedef __sighandler_t sig_t; +#endif -extern int sigblock __P ((int __mask)); -extern int sigpause __P ((int __mask)); -extern int sigsetmask __P ((int __mask)); -extern int siggetmask __P ((void)); -extern void psignal __P ((int __sig, __const char *__str)); +#ifdef __USE_POSIX -extern int siginterrupt __P ((int __sig, int __flag)); +/* Clear all signals from SET. */ +extern int sigemptyset (sigset_t *__set) __THROW __nonnull ((1)); -/* The `sig' bit is set if the interrupt on it - * is enabled via siginterrupt (). */ -extern sigset_t _sigintr; +/* Set all signals in SET. */ +extern int sigfillset (sigset_t *__set) __THROW __nonnull ((1)); -#endif /* Use BSD. */ +/* Add SIGNO to SET. */ +extern int sigaddset (sigset_t *__set, int __signo) __THROW __nonnull ((1)); +libc_hidden_proto(sigaddset) -#ifdef __USE_BSD_SIGNAL +/* Remove SIGNO from SET. */ +extern int sigdelset (sigset_t *__set, int __signo) __THROW __nonnull ((1)); +libc_hidden_proto(sigdelset) -extern __sighandler_t - __bsd_signal __P ((int __sig, __sighandler_t)); -#define signal __bsd_signal +/* Return 1 if SIGNO is in SET, 0 if not. */ +extern int sigismember (const sigset_t *__set, int __signo) + __THROW __nonnull ((1)); -#endif /* __USE_BSD_SIGNAL */ +# ifdef __USE_GNU +/* Return non-empty value is SET is not empty. */ +extern int sigisemptyset (const sigset_t *__set) __THROW __nonnull ((1)); + +/* Build new signal set by combining the two inputs set using logical AND. */ +extern int sigandset (sigset_t *__set, const sigset_t *__left, + const sigset_t *__right) __THROW __nonnull ((1, 2, 3)); + +/* Build new signal set by combining the two inputs set using logical OR. */ +extern int sigorset (sigset_t *__set, const sigset_t *__left, + const sigset_t *__right) __THROW __nonnull ((1, 2, 3)); +# endif /* GNU */ + +/* Get the system-specific definitions of `struct sigaction' + and the `SA_*' and `SIG_*'. constants. */ +# include + +/* Get and/or change the set of blocked signals. */ +extern int sigprocmask (int __how, const sigset_t *__restrict __set, + sigset_t *__restrict __oset) __THROW; +libc_hidden_proto(sigprocmask) + +/* Change the set of blocked signals to SET, + wait until a signal arrives, and restore the set of blocked signals. + + This function is a cancellation point and therefore not marked with + __THROW. */ +extern int sigsuspend (const sigset_t *__set) __nonnull ((1)); +#ifdef _LIBC +extern __typeof(sigsuspend) __sigsuspend_nocancel attribute_hidden; +libc_hidden_proto(sigsuspend) +#endif + +/* Get and/or set the action for signal SIG. */ +extern int sigaction (int __sig, const struct sigaction *__restrict __act, + struct sigaction *__restrict __oact) __THROW; +#ifdef _LIBC +# if 0 /* this is in headers */ +/* In uclibc, userspace struct sigaction is identical to + * "new" struct kernel_sigaction (one from the Linux 2.1.68 kernel). + * See sigaction.h + */ +struct old_kernel_sigaction; +extern int __syscall_sigaction(int, const struct old_kernel_sigaction *, + struct old_kernel_sigaction *) attribute_hidden; +# else /* this is how the function is built */ +extern __typeof(sigaction) __syscall_sigaction attribute_hidden; +# endif +# define __need_size_t +# include +/* candidate for attribute_hidden, if NPTL would behave */ +extern int __syscall_rt_sigaction(int, const struct sigaction *, + struct sigaction *, size_t) +# ifndef __UCLIBC_HAS_THREADS_NATIVE__ + attribute_hidden +# endif + ; +extern __typeof(sigaction) __libc_sigaction; +libc_hidden_proto(sigaction) + +# ifdef __mips__ +# define _KERNEL_NSIG_WORDS (_NSIG / _MIPS_SZLONG) +typedef struct { + unsigned long sig[_KERNEL_NSIG_WORDS]; +} kernel_sigset_t; +# define __SYSCALL_SIGSET_T_SIZE (sizeof(kernel_sigset_t)) +# else +# define __SYSCALL_SIGSET_T_SIZE (_NSIG / 8) +# endif +#endif + +/* Put in SET all signals that are blocked and waiting to be delivered. */ +extern int sigpending (sigset_t *__set) __THROW __nonnull ((1)); -__END_DECLS -#if _MIT_POSIX_THREADS -#define __SIGFILLSET 0xffffffff -#define __SIGEMPTYSET 0 -#define __SIGADDSET(s,n) ((*s) |= (1 << ((n) - 1))) -#define __SIGDELSET(s,n) ((*s) &= ~(1 << ((n) - 1))) -#define __SIGISMEMBER(s,n) ((*s) & (1 << ((n) - 1))) +/* Select any of pending signals from SET or wait for any to arrive. + + This function is a cancellation point and therefore not marked with + __THROW. */ +extern int sigwait (const sigset_t *__restrict __set, int *__restrict __sig) + __nonnull ((1, 2)); + +# if defined __USE_POSIX199309 && defined __UCLIBC_HAS_REALTIME__ +/* Select any of pending signals from SET and place information in INFO. + + This function is a cancellation point and therefore not marked with + __THROW. */ +extern int sigwaitinfo (const sigset_t *__restrict __set, + siginfo_t *__restrict __info) __nonnull ((1)); +#ifdef _LIBC +extern __typeof(sigwaitinfo) __sigwaitinfo attribute_hidden; +#endif + +/* Select any of pending signals from SET and place information in INFO. + Wait the time specified by TIMEOUT if no signal is pending. + + This function is a cancellation point and therefore not marked with + __THROW. */ +extern int sigtimedwait (const sigset_t *__restrict __set, + siginfo_t *__restrict __info, + const struct timespec *__restrict __timeout) + __nonnull ((1)); +#ifdef _LIBC +extern __typeof(sigtimedwait) __sigtimedwait_nocancel attribute_hidden; +libc_hidden_proto(sigtimedwait) +#endif + +/* Send signal SIG to the process PID. Associate data in VAL with the + signal. */ +extern int sigqueue (__pid_t __pid, int __sig, const union sigval __val) + __THROW; +# endif /* Use POSIX 199306. */ + +#endif /* Use POSIX. */ + +#ifdef __USE_BSD + +# ifdef __UCLIBC_HAS_SYS_SIGLIST__ +/* Names of the signals. This variable exists only for compatibility. + Use `strsignal' instead (see ). */ +# define _sys_siglist sys_siglist +extern const char *const sys_siglist[_NSIG]; +# endif + +#ifndef __UCLIBC_STRICT_HEADERS__ +/* Structure passed to `sigvec'. */ +struct sigvec + { + __sighandler_t sv_handler; /* Signal handler. */ + int sv_mask; /* Mask of signals to be blocked. */ + + int sv_flags; /* Flags (see below). */ +# define sv_onstack sv_flags /* 4.2 BSD compatibility. */ + }; + +/* Bits in `sv_flags'. */ +# define SV_ONSTACK (1 << 0)/* Take the signal on the signal stack. */ +# define SV_INTERRUPT (1 << 1)/* Do not restart system calls. */ +# define SV_RESETHAND (1 << 2)/* Reset handler to SIG_DFL on receipt. */ +#endif + + +#if 0 +/* If VEC is non-NULL, set the handler for SIG to the `sv_handler' member + of VEC. The signals in `sv_mask' will be blocked while the handler runs. + If the SV_RESETHAND bit is set in `sv_flags', the handler for SIG will be + reset to SIG_DFL before `sv_handler' is entered. If OVEC is non-NULL, + it is filled in with the old information for SIG. */ +extern int sigvec (int __sig, const struct sigvec *__vec, + struct sigvec *__ovec) __THROW; +#endif + + +/* Get machine-dependent `struct sigcontext' and signal subcodes. */ +# include + +#if 0 +/* Restore the state saved in SCP. */ +extern int sigreturn (struct sigcontext *__scp) __THROW; +#endif + +#endif /* use BSD. */ + + +#if defined __USE_BSD || defined __USE_XOPEN_EXTENDED +# define __need_size_t +# include + +# ifdef __UCLIBC_SUSV4_LEGACY__ +/* If INTERRUPT is nonzero, make signal SIG interrupt system calls + (causing them to fail with EINTR); if INTERRUPT is zero, make system + calls be restarted after signal SIG. */ +extern int siginterrupt (int __sig, int __interrupt) __THROW; +# endif + +# include +# ifdef __USE_XOPEN +/* This will define `ucontext_t' and `mcontext_t'. */ +/* SuSv4 obsoleted include/ucontext.h */ +# include +# endif + +# if 0 +/* Run signals handlers on the stack specified by SS (if not NULL). + If OSS is not NULL, it is filled in with the old signal stack status. + This interface is obsolete and on many platform not implemented. */ +extern int sigstack (struct sigstack *__ss, struct sigstack *__oss) + __THROW __attribute_deprecated__; +# endif + +/* Alternate signal handler stack interface. + This interface should always be preferred over `sigstack'. */ +extern int sigaltstack (const struct sigaltstack *__restrict __ss, + struct sigaltstack *__restrict __oss) __THROW; + +#endif /* use BSD or X/Open Unix. */ + +#if defined __USE_XOPEN_EXTENDED && defined __UCLIBC_HAS_OBSOLETE_BSD_SIGNAL__ +/* Simplified interface for signal management. */ + +/* Add SIG to the calling process' signal mask. */ +extern int sighold (int __sig) __THROW; + +/* Remove SIG from the calling process' signal mask. */ +extern int sigrelse (int __sig) __THROW; + +/* Set the disposition of SIG to SIG_IGN. */ +extern int sigignore (int __sig) __THROW; + +/* Set the disposition of SIG. */ +extern __sighandler_t sigset (int __sig, __sighandler_t __disp) __THROW; +#endif + +#if defined __UCLIBC_HAS_THREADS__ && (defined __USE_POSIX199506 || defined __USE_UNIX98) +/* Some of the functions for handling signals in threaded programs must + be defined here. */ +# include +# include +#endif + +/* The following functions are used internally in the C library and in + other code which need deep insights. */ + +/* Return number of available real-time signal with highest priority. */ +extern int __libc_current_sigrtmin (void) __THROW; +/* Return number of available real-time signal with lowest priority. */ +extern int __libc_current_sigrtmax (void) __THROW; + +#ifdef _LIBC +extern sigset_t _sigintr attribute_hidden; +/* simplified version without parameter checking */ +# include +# undef __sigemptyset +# define __sigemptyset(ss) (memset(ss, '\0', sizeof(sigset_t)), 0) #endif +#endif /* signal.h */ + +__END_DECLS -#endif /* _SIGNAL_H */ +#endif /* not signal.h */