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。參見
廣告
|