首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> 關於C語言

Linux C 編程:signal 與 sigaction 信號處理註冊完整比較

     編輯:關於C語言

signal 簡易註冊

void (*signal(int signo, void (*func)(int)))(int);
  • func:處理函數,參數為信號編號,回傳 void
  • 特殊值:SIG_IGN (忽略)、SIG_DFL (預設動作)
  • 回傳前一次處理函數指標,錯誤傳回 SIG_ERR

signal 範例

void handler(int sig) { puts("Signal caught"); }
signal(SIGINT, handler);

sigaction 進階控制

int sigaction(int signo, const struct sigaction *act, struct sigaction *oldact);

sigaction 結構體

struct sigaction {
    void (*sa_handler)(int);           // 一般處理函數
    void (*sa_sigaction)(int, siginfo_t*, void*); // 擴充處理函數
    sigset_t sa_mask;                  // 執行處理函數時阻塞的信號
    int sa_flags;                      // 行為旗標
};

關鍵 sa_flags

旗標效果
SA_NOCLDSTOPSIGCHLD:僅子進程結束產生,停止不產生
SA_NOCLDWAITSIGCHLD:避免殭屍進程
SA_NODEFER / SA_NOMASK處理函數執行時不阻塞自身信號
SA_ONESHOT / SA_RESETHAND執行一次後重置為預設動作
SA_RESTART被中斷的系統呼叫自動重啟
SA_SIGINFO使用 sa_sigaction 而非 sa_handler

sigaction 完整範例

struct sigaction act = {0};
act.sa_handler = handler;
sigemptyset(&act.sa_mask);
act.sa_flags = 0;
sigaction(SIGINT, &act, NULL);

比較總結

特性signalsigaction
可攜性ANSI CPOSIX.1
信號遮罩控制無sa_mask 精確控制
旗標控制無多種行為旗標
擴充資訊無sa_sigaction + siginfo_t
推薦度簡單場合生產環境/複雜需求

sigaction 可完全取代 signal,建議新專案優先使用。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved