使用alarm API實現靈活的延時操作

2021-09-20 23:44:22 字數 880 閱讀 4954

部落格:linuxfocus.blog.chinaunix.net

在linux系統中的daemon,大都有reload configuration的功能,一般情況下通過傳送sighup給服務daemon,可以使daemon重新讀取其配置檔案,如free radius。

當我們為radius包裝一層功能時,比如通過web對radius進行配置。為了方便使用者的使用,肯定需要在使用者對radius的配置進行更改以後,給radiusd傳送sighup通知reload。不過,在實際的使用過程中,使用者往往不是只修改乙個配置,往往是有大量配置的修改。如果每次都重啟radiusd程序,無疑是沒有必要的,且會降低系統的反應和處理速度。

那麼我們可以使用延時reload的功能,比如修改乙個配置後,通知radius五秒以後reload。如果在這5秒期間,仍然有其它改動,那麼在從改動點順延5秒,直至5秒內沒有任何配置,再讓radius reload其配置檔案。

根據這個需求,我們需要修改radius的sighup的訊號處理函式。當收到乙個sighup時,需要啟動乙個定時器。並且當再次收到sighup時,修改已有的定時器,重置其定時間隔5秒鐘。從上面的描述上看,沒有幾十行**時完不成這個需求的,並且還有引入bug的可能性。

但是如果我們使用alarm的話,可以用幾行**完成這個功能。步驟如下:

1. 修改sighup的訊號處理函式,在訊號處理函式中呼叫alarm(radius_delay_reload_time),其中radius_delay_reload_time為5;

2. 把原來的sighup訊號處理函式(處理reload功能),作為sigalrm的訊號處理函式。

好了,這樣,僅僅通過大概5行的**就完成了上述需求。這裡,利用的就是alarm的乙個特性,當前一次alarm設定的時間沒有到期時,再次呼叫alarm會覆蓋前乙個時間。

靈活的使用try catch

最近在使用一些第三方控制項的時候,他需要我時間進去,但是是把 2017 08 14 18 22 19 這樣的時間格式拆分,比如下面這樣 selecteddate.set integer.valueof time.substring 0,4 integer.valueof time.substring...

靈活使用paste

1.需求 有如下資料 dowith root total dowith root free dowith root urate dowith home total dowith home free dowith home urate dowith disk total dowith disk fre...

靈活使用控制項

vb 提供了視覺化的開發介面,這為我們開發軟體提供了很大的方便,尤其是那些控制項,我們只要拖過來就能用.但是初學者我們往往會被課本束縛.課本上這麼用的,我們就這麼用.比如課本上用命令按鈕去選擇.我們有時候就只知道用commandbutton.但是commandbutton 它的外形呆板.對於我們設計...