**:
8.5.1 sigalrm訊號
在進行阻塞式系統呼叫時,為避免程序陷入無限期的等待,可以為這些阻塞式系統呼叫設定定時器。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訊號和SIGCHID訊號
在進行堵塞式系統呼叫時。為避免程序陷入無限期的等待,能夠為這些堵塞式系統呼叫設定定時器。linux提供了alarm系統呼叫和sigalrm訊號實現這個功能。要使用定時器。首先要安裝sigalrm訊號。假設不安裝sigalrm訊號,則程序收到sigalrm訊號後。預設的動作就是終止當前程序。sigal...
理解SIGALRM訊號
sigalrm訊號是作業系統中的其中乙個訊號。他的作用是設定程序隔多久後會收到乙個sigalrm訊號。下面我們看一下他的實現原理。alarm系統呼叫是設定多久觸發sigalrm訊號的函式。下面是他的宣告。include unsigned alarm unsigned seconds 我們看看實現。i...
你家的WiFi訊號強嗎?
前段時間家裡換了上網 之前用的兩兆實在不夠用。無線路由器放客廳,但是房門一關,房間的訊號就弱了很多。即使下了wifi共享精靈9www.wifigx.com0,訊號也不是特別強。這讓我很苦惱。沒辦法了,得公升級上網 了。不過藉此也詢問了有哪些因素影響了 wifi 訊號?無線路由器放客廳,其實不只是房間...