強 SIGALRM訊號和SIGCLD訊號

2021-06-19 02:13:33 字數 1817 閱讀 1348

**:

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 訊號?無線路由器放客廳,其實不只是房間...