(四)linux進程通訊、信號(Signal)

信號是UNIX中所使用的進程通信的一種最古老的方法,是一種異步通信方式。信號可以直接進行用戶空間進程和內核進程之間的交互,內核進程也可以利用它來通知用戶空間進程發生了哪些系統事件。它可以在任何時候發給某一進程,而無需知道該進程的狀態。

一個完整的信號生命週期可以分爲如下階段

這裏寫圖片描述

用戶進程對信號的響應可以有3種方式。
忽略信號,即對信號不做任何處理,但是有兩個信號不能忽略,即SIGKILL及SIGSTOP。
捕捉信號,定義信號處理函數,當信號發生時,執行相應的自定義處理函數。
執行缺省操作,Linux對每種信號都規定了默認操作,比如linux終端經常用ctrl+c終止某個進程

這裏寫圖片描述

信號發送
kill()
kill()函數可以發送各種信號給進程或進程組,成功返回0
這裏寫圖片描述
raise()
與kill()函數所不同的是,raise()函數允許進程向自身發送信號。
這裏寫圖片描述

alarm()
alarm()也稱爲鬧鐘函數,它可以在進程中設置一個定時器,當定時器指定的時間到時,它就向進程發送SIGALARM信號。要注意的是,一個進程只能有一個鬧鐘時間,如果在調用alarm()之前已設置過鬧鐘時間,則任何以前的鬧鐘時間都被新值所代替。
這裏寫圖片描述
pause()

pause()函數是用於將調用進程掛起直至捕捉到信號爲止。這個函數很常用,通常可以用於判斷信號是否已到。
這裏寫圖片描述
注意:程序中有多少個pause(),就對應捕捉多少個信號


信號捕捉

信號處理的主要方法有兩種,一種是使用簡單的signal()函數,另一種是使用信號集函數組。 使用信號集函數組處理信號時涉及一系列的函數來創建信號集、註冊信號處理函數及檢測信號等,信號集函數組使用較少,就不研究了。

這裏寫圖片描述

最後一個簡單的例子

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

void alarm_handler(int signum)
{
	printf("I have been waken up by signal(%d).\n",signum);
}
int main()
{
	int ret;
	signal(SIGALRM,alarm_handler);
	ret=alarm(3);
	pause();
	printf("The alarm return value is  (%d).\n",ret);
	
	return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章