函式
<csignal>

signal

void (*signal(int sig, void (*func)(int)))(int);
設定處理訊號的函式
sig 指定的訊號編號指定處理訊號的方式。

引數 func 指定了程式處理訊號的三種方式之一
  • 預設處理 (SIG_DFL):訊號由該特定訊號的預設操作處理。
  • 忽略訊號 (SIG_IGN):訊號被忽略,即使程式碼執行沒有意義,也會繼續執行。
  • 函式處理器:定義了一個特定的函式來處理訊號。

在程式啟動時,SIG_DFLSIG_IGN 被設定為每個支援的訊號的預設訊號處理行為。

引數

sig
要設定處理函式的訊號值。以下宏常量表達式標識了標準訊號值

signal
SIGABRT(Signal Abort) 異常終止,例如由 abort 函式發起的終止。
SIGFPE(Signal Floating-Point Exception) 錯誤的算術運算,例如除以零或導致溢位的運算(不一定與浮點運算有關)。
SIGILL(Signal Illegal Instruction) 無效的函式映像,例如非法指令。這通常是由於程式碼損壞或嘗試執行資料所致。
SIGINT(Signal Interrupt) 互動式注意訊號。通常由應用程式使用者生成。
SIGSEGV(訊號分段違例) 無效的儲存訪問:當程式嘗試讀取或寫入其已分配記憶體之外的區域時。
SIGTERM(Signal Terminate) 傳送給程式的終止請求。

每個庫實現都可以提供額外的訊號值宏常量,這些常量可以與此函式一起使用。

請注意,並非所有執行環境都被要求自動生成訊號,即使是在上述特定情況下,儘管所有執行環境都必須傳遞由顯式呼叫 raise 函式生成的訊號。
func
函式指標。它可以是程式設計師定義的函式,也可以是以下預定義函式之一

SIG_DFL預設處理:訊號由該特定訊號的預設操作處理。
SIG_IGN忽略訊號:訊號被忽略。

如果是一個函式,它應該遵循以下原型(帶有 C 連結)
1
void handler_function (int parameter);

返回值

返回型別與引數 func 的型別相同。

如果請求成功,函式將返回一個指向在呼叫之前負責處理該訊號的特定處理函式的指標,如果有的話。或者,如果呼叫前訊號被預設處理程式處理或被忽略,則返回 SIG_DFLSIG_IGN

如果函式在註冊新的訊號處理程式方面不成功,它將返回 SIG_ERR,並且 errno 可能被設定為正值。

示例

/* signal example */
#include <stdio.h>      /* printf */
#include <signal.h>     /* signal, raise, sig_atomic_t */

sig_atomic_t signaled = 0;

void my_handler (int param)
{
  signaled = 1;
}

int main ()
{
  void (*prev_handler)(int);

  prev_handler = signal (SIGINT, my_handler);

  /* ... */
  raise(SIGINT);
  /* ... */
  
  printf ("signaled is %d.\n",signaled);
  

  return 0;
}
signaled is 1.

資料競爭

未定義:在多執行緒程式中呼叫此函式會導致未定義的行為

異常 (C++)

無異常保證:此函式從不丟擲異常。

另見