signal() - Unix 和 Linux 系統呼叫 - 技術教學
Tutorials Point


  Unix 初學者指南
  Unix Shell 程式設計
  高階 Unix
  Unix 有用參考
  Unix 有用資源
  精選閱讀

版權所有 © 2014 tutorialspoint



  首頁     參考     討論論壇     關於 TP  

signal() - Unix 和 Linux 系統呼叫


previous next AddThis Social Bookmark Button

廣告

名稱

signal - ANSI C 訊號處理

語法

#include <signal.h>

typedef void (*sighandler_t)(int);

sighandler_t signal(int signum, sighandler_t handler);

描述

signal() 系統呼叫為編號為 signum 的訊號安裝新的訊號處理程式。訊號處理程式設定為 sighandler,它可以是使用者指定的函式,也可以是 SIG_IGNSIG_DFL

當接收到編號為 signum 的訊號時,會發生以下情況。如果相應的處理程式設定為 SIG_IGN,則忽略該訊號。如果處理程式設定為 SIG_DFL,則發生與該訊號關聯的預設操作(參見 signal(7))。最後,如果處理程式設定為函式 sighandler,則首先將處理程式重置為 SIG_DFL 或執行實現相關的訊號阻塞,然後呼叫 sighandler,並傳入引數 signum

使用訊號處理程式函式處理訊號稱為“捕獲訊號”。訊號 SIGKILLSIGSTOP 無法捕獲或忽略。

返回值

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) 函式以外的函式生成的 SIGFPESIGILLSIGSEGV 訊號,則其行為未定義。整數除以零的結果未定義。在某些體系結構上,它會生成 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。

參見



previous next Printer Friendly

廣告


  

廣告



廣告