網路程式設計教程(八)訊號和定時器

2021-08-21 20:04:51 字數 2318 閱讀 9142

#include #include int kill(pid_t pid, int sig);

函式功能:

向程序id為pid的程序傳送訊號sig

函式引數:

pid:程序編號

sig:訊號值

返回值:

函式成功時返回0,失敗則返回-1,並設定errno.

#include typedef void (*__sighanlder_t) (int);

函式功能:

定義乙個函式指標,當目標程序收到訊號時,就呼叫該函式指標所指的函式進行處理

函式引數:

__sighandler_t:函式指標,指向有乙個整型引數,而無返回值的函式

#include _sighandler_t signal(int sig, _sighandler_t _handler);

函式功能:

為訊號sig設定處理函式_handler()a

函式引數:

sig :訊號

_handler:訊號對應的處理函式

返回值:

成功時返回乙個函式指標,該函式指標的型別也是_sighandler_t。這個返回值時前一次呼叫signal函式時傳入的函式指標,或者是訊號sig對應的預設處理函式指標sig_def.呼叫出錯時返回sig_err,並設定errno.

(2)sigaction系統呼叫

#include int sigaction(int sig, const struct sigaction *act, struct sigaction *oact);

函式功能:

為訊號sig設定處理函式

函式引數:

sig :指定要捕獲的訊號型別

act :指定新的訊號處理方式

oact:輸出訊號先前的處理方式

伺服器程式管理者眾多的定時時間,因此有效地組織這些定時時間,使之能在預期的時間點被觸發且不影響伺服器的主要邏輯,對於伺服器效能有著至關重要的影響。為此將每個定時事件分別封裝成定時器,並使用某種容器類資料結構,比如鍊錶、排序鍊錶和時間輪,將所有定時器串聯起來,以實現對定時事件的統一管理。所謂的定時是指在一段時間之後觸發某段**的機制。在這段**中一次處理所有到期的定時器。

linux提供三種定時方法:socket選項so_rcvtimeo和so_sndtimeo、sigalrm訊號和i/o復用系統呼叫的超時引數。

so_rcvtimeo和so_sndtimeo分別用來設定socket接收資料超時時間和傳送資料超時時間。這兩個選項只對send、sendmsg、recv、recvmsg、accept和connect系統呼叫有效。

注:通過setsockopt()函式設定這個選項。

由alarm和setitimer函式設定的實時鬧鐘一旦超時,將觸發sigalrm訊號。因此,我們可以利用該訊號的訊號處理函式來處理定時任務。但是,如果要處理多個定時任務,需要不斷地觸發sigalrm訊號,並在其訊號處理函式中執行到期的任務。一般而言,sigalrm訊號按照固定的頻率生成,即由alarm或setitimer函式設定的定時週期t保持不變。如果某個定時任務的超時時間不是t的整數倍,那麼它實際被執行的事件和預期的時間將略有偏差。

linux下的3組i/o復用系統呼叫都帶有超時引數,因此它們不僅能統一處理訊號和i/o事件,也能統一處理定時事件。但是由於i/o復用系統呼叫可能在超時時間到期之前就返回(有i/o事件發生),所以我們如果要利用它們來定時,就需要不斷更新定時引數以反映剩餘的事件。

如上圖所示,實線指向輪子的乙個槽,它以恆定的速度順時針轉動,每轉動一步就指向下乙個槽(虛線指標指向的槽),每次轉動稱為乙個滴答(tick)。乙個滴答的時間稱為時間輪的槽間隔si,它實際上就是心博時間。該時間輪共有n個槽,因為它運轉一周的事件時n*si.每個槽執行一條定時器鍊錶,每條鍊錶上的定時器具有相同的特徵:它們的定時時間相差n*si的整數倍。時間輪正是利用這個關係將定時器雜湊到不同的鍊錶中。加入現在指標指向槽cs,我們要新增乙個定時時間為ti的定時器,該定時器將被插入槽ts對應的鍊錶中:ts=(cs + (ti /si)) % n.

基於排序鍊錶的定時器使用唯一的一條鍊錶來管理所有定時器,所以插入操作的效率隨著定時器資料的增多而降低。而時間輪使用雜湊表的思想,將定時器雜湊到不同鍊錶上。這樣每條鍊錶上的定時器數目將明顯少於原來的排序鍊錶上的定時器數目,插入操作的效率基本不受定時器數目的影響。

對時間輪而言,要提高定時精度,就要是si值足夠小;要提高執行效率,則要是n值足夠大。

mysql定時器 教程 Mysql 定時器

定時任務 週期任務 檢視命令 show variables like event sche 顯示的event scheduler為off時用以下命令開啟 set global event scheduler 1 注意 以上的改法在資料庫重啟後將會恢復為原來狀態,要想資料庫重啟後也可以讓event s...

alarm訊號 select RTC定時器

include include void car handler int signo 設定5秒停止錄音 signal sigalrm,car handler alarm 5 設定定時5s原型 intselect int nfds,fd set readfds,fd set writefds,fd s...

Android程式設計 定時器和Handler的使用

android程式設計 定時器和handler的使用 環境 主機 win8 開發環境 android studio 定時器使用示例 初始化 定時器 private timer timer work new timer 工作間隔,單位 ms private final int interval wor...