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