在進行堵塞式系統呼叫時。為避免程序陷入無限期的等待,能夠為這些堵塞式系統呼叫設定定時器。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 是離散訊號取樣率 ...