Originální popis anglicky:
signal - ANSI C signal handling
Návod, kniha: Linux Programmer's Manual
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t
handler);
The
signal() system call installs a new signal handler for the signal
with number
signum. The signal handler is set to
sighandler
which may be a user specified function, or either
SIG_IGN or
SIG_DFL.
Upon arrival of a signal with number
signum the following happens. If the
corresponding handler is set to
SIG_IGN, then the signal is ignored. If
the handler is set to
SIG_DFL, then the default action associated to
the signal (see
signal(7)) occurs. Finally, if the handler is set to a
function
sighandler then first either the handler is reset to SIG_DFL
or an implementation-dependent blocking of the signal is performed and next
sighandler is called with argument
signum.
Using a signal handler function for a signal is called "catching the
signal". The signals
SIGKILL and
SIGSTOP cannot be caught
or ignored.
The
signal() function returns the previous value of the signal handler,
or
SIG_ERR on error.
The original Unix
signal() would reset the handler to SIG_DFL, and System
V (and the Linux kernel and libc4,5) does the same. On the other hand, BSD
does not reset the handler, but blocks new instances of this signal from
occurring during a call of the handler. The glibc2 library follows the BSD
behaviour.
If one on a libc5 system includes
<bsd/signal.h> instead of
<signal.h> then
signal is redefined as
__bsd_signal
and signal has the BSD semantics. This is not recommended.
If one on a glibc2 system defines a feature test macro such as
_XOPEN_SOURCE or uses a separate
sysv_signal function, one
obtains classical behaviour. This is not recommended.
Trying to change the semantics of this call using defines and includes is not a
good idea. It is better to avoid
signal altogether, and use
sigaction(2) instead.
The effects of this call in a multi-threaded process are unspecified.
The routine
handler must be very careful, since processing elsewhere was
interrupted at some arbitrary point. POSIX has the concept of "safe
function". If a signal interrupts an unsafe function, and
handler
calls an unsafe function, then the behavior is undefined. Safe functions are
listed explicitly in the various standards. The POSIX 1003.1-2003 list is
_Exit() _exit() abort() accept() access() aio_error() aio_return() aio_suspend()
alarm() bind() cfgetispeed() cfgetospeed() cfsetispeed() cfsetospeed() chdir()
chmod() chown() clock_gettime() close() connect() creat() dup() dup2()
execle() execve() fchmod() fchown() fcntl() fdatasync() fork() fpathconf()
fstat() fsync() ftruncate() getegid() geteuid() getgid() getgroups()
getpeername() getpgrp() getpid() getppid() getsockname() getsockopt() getuid()
kill() link() listen() lseek() lstat() mkdir() mkfifo() open() pathconf()
pause() pipe() poll() posix_trace_event() pselect() raise() read() readlink()
recv() recvfrom() recvmsg() rename() rmdir() select() sem_post() send()
sendmsg() sendto() setgid() setpgid() setsid() setsockopt() setuid()
shutdown() sigaction() sigaddset() sigdelset() sigemptyset() sigfillset()
sigismember() signal() sigpause() sigpending() sigprocmask() sigqueue()
sigset() sigsuspend() sleep() socket() socketpair() stat() symlink() sysconf()
tcdrain() tcflow() tcflush() tcgetattr() tcgetpgrp() tcsendbreak() tcsetattr()
tcsetpgrp() time() timer_getoverrun() timer_gettime() timer_settime() times()
umask() uname() unlink() utime() wait() waitpid() write().
According to POSIX, the behaviour of a process is undefined after it ignores a
SIGFPE,
SIGILL, or
SIGSEGV signal that was not generated
by the
kill(2) or the
raise(3) functions. Integer division by
zero has undefined result. On some architectures it will generate a
SIGFPE signal. (Also dividing the most negative integer by -1 may
generate
SIGFPE.) Ignoring this signal might lead to an endless loop.
According to POSIX (3.3.1.3) it is unspecified what happens when
SIGCHLD
is set to
SIG_IGN. Here the BSD and SYSV behaviours differ, causing BSD
software that sets the action for
SIGCHLD to
SIG_IGN to fail on
Linux.
The use of
sighandler_t is a GNU extension. Various versions of libc
predefine this type; libc4 and libc5 define
SignalHandler, glibc
defines
sig_t and, when
_GNU_SOURCE is defined, also
sighandler_t.
ANSI C
kill(1),
alarm(2),
kill(2),
killpg(2),
pause(2),
sigaction(2),
sigvec(2),
raise(3),
sigsetops(3),
signal(7)