用alarm 為recvfrom設定定時器

2022-07-31 01:45:12 字數 1172 閱讀 8138

因為專案需要,需要以5s為週期,收集廣播資訊,所以就要用到定時器和recvfrom函式,而在實用的過程中發現,5s到了,而程式仍然處於阻塞狀態,一直糾結了好久,才找到問題所在,在此mark一下,以備後期回顧。

歸根結底,原因在於使用的signal()函式:signal()是重啟函式,超時以後會自動啟動已阻塞的函式,而不是中斷它的執行,如recvfrom,給人的感覺就是使用了alarm,但依然阻塞在了recvfrom上,不往下執行。但在中斷處理函式中用printf函式列印一條訊息,就會發現,其實它是中斷過的,只是返回後又阻塞在了recvfrom上而已。

而使用sigaction函式,可以設定是否要重啟函式,即alarmact.sa_flags = sa_nomask;選項,它會中斷已阻塞的函式,使程式繼續往下執行。而sa_restart選項則等同於signal效果,會重啟函式,阻塞在recvfrom上。

#include #include 

#include

#include

#include

#include

in.h>

intn;

char recvbuf[1024

];void

listen_board();

static

void dealsigalarm(int

sigo)

void

main()

void

listen_board()

while(1

)

else

alarm(0);}}

按照上述程式執行,得到的結果如下圖所示(既呼叫了中斷函式,又終止了recvfrom函式):

而設定為alarmact.sa_flags = sa_restart;選項時,結果如下圖(僅呼叫了中斷函式,卻阻塞在了recvfrom上,結果與使用signal()函式效果相同):

另:訊號處理流程:若設定了訊號處理函式,當訊號到達時,會將控制流轉向訊號處理器。從訊號處理器返回後,繼續執行原來的控制流。

參考資料:

用激情為青春喝彩

用激情為青春喝彩 青春如朝陽正午,萬物欣欣向榮,樂觀向上 青春如大江東去,一直磅礴向前,開拓進取 正值飛揚青春的我們,將用激情為青春喝彩!不是剪剪的飛燕,卻銜來春的泥丸 不是翩躚的蝴蝶,卻播下愛的花粉.晨鐘暮鼓,送一段人間的往事 滄桑輪迴,寫一曲夢幻的詩篇.青春就像身帶雙翼的精靈,悄悄駐足在我們身邊...

用CSS為table新增邊框

在用css給 定義1畫素的邊框的時候,是個比較棘手的問題,在定義的時候,很容易把邊框定義重複了,很多人問過我這個問題,今天我把我為 新增的方法給大家,其實方法很簡單的,就是邏輯關係比較難懂。裡面的單元格都是四條邊的,那這單元格裡面的四條邊怎麼定義好呢?我們拿乙個只有四個單元格的 下面用1,2,3,4...

用openssl為apache製作ssl證書

步驟1 生成金鑰 命令 openssl genrsa 1024 server.key 說明 這是用128位rsa演算法生成金鑰,得到server.key檔案 步驟2 生成證書請求 命令 openssl req new key server.key server.csr 說明 這是用步驟1的金鑰生成證...