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

C語言 signal() 函數詳解:信號處理機制與使用指南

     編輯:關於C語言

signal() 函數概述

在 C 語言中,signal() 函數用於設置特定信號的處理方式,是進行信號處理編程的核心接口。它定義於 <signal.h> 頭文件中,允許程序自定義對特定信號的響應動作,如忽略、捕獲或恢復默認行為。

函數原型與參數說明

#include <signal.h>

void (*signal(int signum, void (*handler)(int)))(int);
// 或者使用 typedef 簡化:
typedef void (*sig_t)(int);
sig_t signal(int signum, sig_t handler);
  • signum:要處理的信號編號。除 SIGKILL 和 SIGSTOP 外,可設置任意信號。
  • handler:信號處理動作,可取三種值:
    1. 函數指針:指向一個無返回值、接受單一 int 參數的函數(信號編號)。收到信號時立即執行該函數,執行完畢後返回被中斷處繼續運行。
    2. SIG_IGN:忽略該信號。
    3. SIG_DFL:恢復系統默認處理方式。

工作機制與返回值

當指定信號到達時,程序跳轉執行 handler 指向的函數。在信號處理函數執行期間,同類信號會被自動阻塞(儲存),直到處理函數返回才會重新調用;但其他類型信號仍可中斷當前處理函數。

返回值:成功返回先前的信號處理函數指針;出錯返回 SIG_ERR(即 (void *)-1)。

常見信號來源

  • 鍵盤輸入:Ctrl+C 產生 SIGINT
  • 硬件異常:除零錯誤、非法內存訪問(SIGSEGV)等
  • 系統調用:kill() 函數發送信號,kill 命令實為其封裝
  • 軟件條件:定時器超時(SIGALRM)、管道破裂(SIGPIPE)等

使用示例

#include <stdio.h>
#include <signal.h>
#include <unistd.h>

void sigint_handler(int sig) {
    printf("\n捕獲到信號 %d (SIGINT),程序即將退出...\n", sig);
    _exit(0);
}

int main() {
    signal(SIGINT, sigint_handler);
    printf("程序運行中,按 Ctrl+C 觸發信號處理...\n");
    while (1) {
        sleep(1);
    }
    return 0;
}

注意事項

  • 信號處理函數應盡量簡短,避免調用非重入函數(如 printf、malloc 等)
  • 多線程程序中信號處理較複雜,建議使用 sigaction() 替代
  • SIGKILL 和 SIGSTOP 無法被捕獲或忽略
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved