signal() - Unix, Linux系统调用
广告
名称signal - ANSI C信号处理概要
#include <signal.h>
typedef void (*sighandler_t)(int);
sighandler_t signal(int signum, sighandler_t handler); 描述signal()系统调用为编号为signum的信号安装新的信号处理程序。信号处理程序设置为sighandler,它可以是用户指定的函数,也可以是SIG_IGN或SIG_DFL。当编号为signum的信号到达时,会发生以下情况。如果相应的处理程序设置为SIG_IGN,则忽略该信号。如果处理程序设置为SIG_DFL,则执行与该信号关联的默认操作(参见signal(7))。最后,如果处理程序设置为函数sighandler,则首先将处理程序重置为SIG_DFL或执行与实现相关的信号阻塞,然后调用sighandler,参数为signum。 使用信号处理程序函数处理信号称为“捕获信号”。SIGKILL和SIGSTOP信号无法捕获或忽略。 返回值signal()函数返回信号处理程序的先前值,或者在出错时返回SIG_ERR。可移植性原始Unix signal()会将处理程序重置为SIG_DFL,System V(以及Linux内核和libc4,5)也是如此。另一方面,BSD不会重置处理程序,而是在调用处理程序期间阻止发生此信号的新实例。glibc2库遵循BSD行为。如果在libc5系统上包含<bsd/signal.h>而不是<signal.h>,则signal()将被重新定义为__bsd_signal,并且signal具有BSD语义。不推荐这样做。 如果在glibc2系统上定义特征测试宏,例如_XOPEN_SOURCE或使用单独的sysv_signal函数,则可以获得经典行为。不推荐这样做。 尝试使用定义和包含来更改此调用的语义不是一个好主意。最好完全避免使用signal(),而改用sigaction(2)。 备注此调用在多线程进程中的效果未定义。例程handler必须非常小心,因为其他地方的处理在某个任意点被中断。POSIX有“安全函数”的概念。如果信号中断了一个不安全函数,并且handler调用了一个不安全函数,则行为未定义。安全函数在各种标准中被明确列出。POSIX.1-2003列表为: _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()。 根据POSIX,如果忽略了不是由kill(2)或raise(3)函数生成的SIGFPE、SIGILL或SIGSEGV信号,则进程的行为未定义。整数除以零的结果未定义。在某些架构上,它会生成SIGFPE信号。(将最小的负整数除以-1也可能会生成SIGFPE。)忽略此信号可能会导致无限循环。 有关将SIGCHLD设置为SIG_IGN时发生的情况的详细信息,请参见sigaction(2)。 sighandler_t的使用是GNU扩展。libc的各种版本预定义了此类型;libc4和libc5定义了SignalHandler,glibc定义了sig_t,并且当定义了_GNU_SOURCE时,也定义了sighandler_t。 符合标准C89, POSIX.1-2001。参见
广告
|