1、信號是什麼?信號本質是什麼?
日常生活中,綠燈是一個信號,停止標牌是一個信號,裁判手勢也是一個信號。
信號本質(計算機):軟中斷信號(signal,又簡稱爲信號)用來通知進程發生了異步事件。在軟件層次上是對中斷機制的一種模擬,在原理上,一個進程收到一個信號與處理器收到一箇中斷請求可以說是一樣的。信號是進程間通信機制中唯一的異步通信機制,一個進程不必通過任何操作來等待信號的到達,事實上,進程也不知道信號到底什麼時候到達。進程之間可以互相通過系統調用kill發送軟中斷信號。內核也可以因爲內部事件而給進程發送信號,通知進程發生了某個事件。信號機制除了基本通知功能外,還可以傳遞附加信息。
2、信號的來源
信號來自內核, 生成信號的請求來自以下3個地方。
(1)用戶
用戶可以通過輸入Ctrl-C, Ctrl-\等命令,或是終端驅動程序分配給信號控制字符的其他任何鍵來請求內核產生信號。
(2)內核
當進程執行出錯時, 內核給進程發送一個信號。 例如,非法段存取,浮點數溢出,亦或是一個非法指令,內核也利用信號通知進程特定事件發生。
(3)進程
一個進程可以通過系統調用kill給另外一個進程發送信號, 一個進程可以和另一個進程通過信號通信。
3、信號類型
4、信號捕獲處理
進程能夠通過系統調用signal告訴內核, 它要如何處理信號, 進程有3個選擇。
(1)接收默認處理(通常是消亡)
SIGINT的默認處理是消亡, 進程並不一定要使用signal接收默認處理,但是進程能夠通過以下調用來恢復默認處理。
signal(SIGINT, SIG_DFL);
(2)忽略信號
程序可以通過以下調用來告訴內核, 它需要忽略SIGINT。
signal(SIGINT, SIG_IGN);
(3)信號處理函數
程序能夠告訴內核,當程序到來時應該調用哪個函數。
signal(signum, functionname);
5、信號處理例子
(1)默認處理信號
#include<stdio.h>
#include<signal.h>
int main()
{
signal(SIGINT,SIG_DFL);
int i;
for( i = 0; i<10;++i)
{
printf("hello world\n");
sleep(1);
}
return 0;
}
(2)忽略信號
#include<stdio.h>
#include<signal.h>
int main()
{
signal(SIGINT,SIG_IGN);
int i;
for( i = 0; i<10;++i)
{
printf("hello world\n");
sleep(1);
}
return 0;
}
(3)使用信號處理處理函數
#include<stdio.h>
#include<signal.h>
int main()
{
void f(int);
signal(SIGINT,f);
int i;
for( i = 0; i<10;++i)
{
printf("hello world\n");
sleep(1);
}
return 0;
}
void f(int signum)
{
printf("SIGINT\n");
}
六、另外補充(sigaction函數)
(1) https://blog.csdn.net/u010889616/article/details/48159537(推薦)
(2)https://blog.csdn.net/wallaceli1981/article/details/4293324