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。参见
广告
|