C语言signal()函数(通过设置一个函数(回调函数)来处理捕获到异常信号时需要执行的操作)
文章目錄
- 描述
- 聲明
- 參數
- 返回值
- 實例
- 附加解釋
- 背景知識:C語言中signal函數簡介及使用
描述
C 庫函數 void (*signal(int sig, void (*func)(int)))(int) 設置一個函數來處理信號,即帶有 sig 參數的信號處理程序。
聲明
下面是 signal() 函數的聲明。
void (*signal(int sig, void (*func)(int)))(int)參數
- sig – 在信號處理程序中作為變量使用的信號碼。下面是一些重要的標準信號常量:
- func – 一個指向函數的指針。它可以是一個由程序定義的函數,也可以是下面預定義函數之一:
返回值
該函數返回信號處理程序之前的值,當發生錯誤時返回 SIG_ERR。
實例
下面的實例演示了 signal() 函數的用法。(在linux下運行,windows沒有unistd.h頭文件)
#include <stdio.h> #include <unistd.h> #include <stdlib.h> #include <signal.h>void sighandler(int);int main() {signal(SIGINT, sighandler);while(1) {printf("開始休眠一秒鐘...\n");sleep(1);}return(0); }void sighandler(int signum) {printf("捕獲信號 %d,跳出...\n", signum);exit(1); } 讓我們編譯并運行上面的程序,這將產生以下結果,且程序會進入無限循環,需使用 CTRL + C 鍵跳出程序。開始休眠一秒鐘... 開始休眠一秒鐘... 開始休眠一秒鐘... 開始休眠一秒鐘... 開始休眠一秒鐘... 捕獲信號 2,跳出...我在linux下編譯運行,還真是這樣子:
[root@ubuntu /home/yg/arnold_test/20211201_TEST_signal]3# gcc TEST_SIGNAL.c [root@ubuntu /home/yg/arnold_test/20211201_TEST_signal]4# [root@ubuntu /home/yg/arnold_test/20211201_TEST_signal]4# [root@ubuntu /home/yg/arnold_test/20211201_TEST_signal]4# ./a.out 開始休眠一秒鐘... 開始休眠一秒鐘... 開始休眠一秒鐘... 開始休眠一秒鐘... 開始休眠一秒鐘... 開始休眠一秒鐘... ^C捕獲信號 2,跳出...附加解釋
void (*signal(int sig, void (*func)(int)))(int)解釋一下該函數的申明怎么讀,后面附帶的兩個(int)的意思是:該符號前的函數指針所對應的函數是帶一個int類型的參數的。比如最外面的,是說signal返回的函數指針所對應的函數是帶int的參數的;里面的,作為參數的函數名是帶一個int參數的。
- 中間部分:
signal函數有2個參數,第一個是int,第二個是無返回值,帶一個int參數的函數指針
- 外圍:
signal函數返回的是一個函數指針,無返回值,有一個int參數
- 簡化:
Sigfunc就代表的就是一個 返回值是一個無返回值,有一個int參數的函數。
最后就成了這樣:
Sigfunc *signal(int, Sigfunc*)參考文章:C 庫函數 - signal()
背景知識:C語言中signal函數簡介及使用
signal.h是C標準函數庫中的信號處理部分,定義了程序執行時如何處理不同的信號。信號用作進程間通信,報告異常行為(如除零)、用戶的一些按鍵組合(如同時按下Ctrl與C鍵,產生信號SIGINT)。C++中的對應頭文件是csignal。
C語言標準定義了6個信號,都定義在signal.h頭文件中:
(1). SIGABRT:程序異常中止,如調用abort函數。(abort)
(2). SIGFPE:算術運算出錯,如除數為0或溢出。
(3). SIGILL:非法函數映像,如非法指令。
(4). SIGINT:交互的用戶按鍵請求,如同時按下Ctrl+C鍵。
(5). SIGSEGV:無效內存訪問,段錯誤。
(6). SIGTERM:程序的中止請求。
signal.h可能還定義了其它信號,這依賴于具體實現。例如,類Unix系統還定義了15個以上的信號。Visual C++的C標準庫只支持C語言標準規定的6個信號,即對信號處理只提供最小的支持。
signal函數:該函數設置一個函數(回調函數)來處理捕獲到異常信號時需要執行的操作
參考文章:C語言中signal函數簡介及使用
總結
以上是生活随笔為你收集整理的C语言signal()函数(通过设置一个函数(回调函数)来处理捕获到异常信号时需要执行的操作)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: C语言 memset()函数(内存初始化
- 下一篇: source insight(SI)C/