SIGALRM訊號和SIGCHID訊號

2022-05-19 13:50:46 字數 1748 閱讀 8555

在進行堵塞式系統呼叫時。為避免程序陷入無限期的等待,能夠為這些堵塞式系統呼叫設定定時器。linux提供了alarm系統呼叫和sigalrm訊號實現這個功能。

要使用定時器。首先要安裝sigalrm訊號。假設不安裝sigalrm訊號,則程序收到sigalrm訊號後。預設的動作就是終止當前程序。

sigalrm訊號成功安裝後,在什麼情況下程序會收到該訊號呢?這就要依賴於linux提供的定時器功能。在linux系統下,每乙個程序都有惟一的乙個定時器,該定時器提供了以秒為單位的定時功能。在定時器設定的超時時間到達後,呼叫alarm的程序將收到sigalrm訊號。

alarm系統呼叫的原型為:

#include

unsigned int alarm(unsigned int seconds);

引數說明:

1)seconds:要設定的定時時間,以秒為單位。在alarm呼叫成功後開始計時。超過該時間將觸發sigalrm訊號。

返回值:

返回當前程序曾經設定的定時器剩餘秒數。

例8-10:程式設計利用sigalrm訊號實現秒定時器。

**例如以下:

#include

#include

//全域性計數器變數

int cnt=0;

//sigalrm訊號處理函式

void cbsigalrm(int signo)

void main()

//關閉標準輸出的行快取模式

setbuf(stdout,null);

//啟動定時器

alarm(1);

//程序進入無限迴圈,僅僅能手動終止

while(1)

}8.5.2 sigcld訊號

在linux的多程序程式設計中,sigcld是乙個很重要的訊號。當乙個子程序退出時。並非馬上釋放其占用的資源,而是通知其父程序,由父程序進行興許的工作。

在這一過程中,系統將依次產生下列事件。

1)向父程序傳送sigcld訊號,子程序進入zombie(殭屍)狀態。

2)父程序接收到sigcld訊號,進行處理。

假設在上述過程中父程序既沒有忽略sigcld訊號。也未捕獲該訊號進行處理,則子程序將進入殭屍狀態。殭屍狀態的程序不能被作業系統呼叫,也沒有不論什麼可執行**,它只是是占用了程序列表中的乙個位置而已。

假設僅有幾個殭屍程序不會影響系統的執行,可是假設殭屍程序過多。則將會嚴重影響系統的執行。因此,在程式設計過程中應避免產生殭屍程序。有兩種主要的處理方法能夠避免產生殭屍程序:一是父程序忽略sigcld訊號;二是父程序捕獲sigcld訊號,在訊號處理函式中獲取子程序的退出狀態。忽略訊號的方式比較簡單。僅僅須要呼叫signal(sigcld,sig_ign)語句就可以完畢。假設要捕獲訊號並處理。那麼先要安裝sigcld訊號,然後在訊號處理函式中呼叫wait或者waitpid等函式獲取子程序的退出狀態。

例8-11:程式設計捕獲sigcld訊號。輸出各子程序的id和退出狀態碼。

**例如以下:

#include

#include

#include

//sigcld訊號處理函式

void cbsigcld(int signo)

void main()

//迴圈建立子程序

for(i=0;i<5;i++)

//假設是父程序

else}}

強 SIGALRM訊號和SIGCLD訊號

8.5.1 sigalrm訊號 在進行阻塞式系統呼叫時,為避免程序陷入無限期的等待,可以為這些阻塞式系統呼叫設定定時器。linux提供了alarm系統呼叫和sigalrm訊號實現這個功能。要使用定時器,首先要安裝sigalrm訊號。如果不安裝sigalrm訊號,則程序收到sigalrm訊號後,預設的...

理解SIGALRM訊號

sigalrm訊號是作業系統中的其中乙個訊號。他的作用是設定程序隔多久後會收到乙個sigalrm訊號。下面我們看一下他的實現原理。alarm系統呼叫是設定多久觸發sigalrm訊號的函式。下面是他的宣告。include unsigned alarm unsigned seconds 我們看看實現。i...

連續訊號和離散訊號

連續余弦訊號 xa t acos t a cos 2 ft 離散余弦訊號 x n a cos n ac os 2 fn x fs t 為連續訊號角速度 單位為 rad s 為單位樣本的弧度,即離散訊號角速度 f為連續訊號頻率 單位為 hz f為相對頻率或歸一化頻率 ff s,fs 是離散訊號取樣率 ...