使用訊號實現超時

2021-04-21 09:16:54 字數 3158 閱讀 5001

訊號是軟體中斷,能夠提供一種處理非同步事件的方法。

這些訊號被定義在signal.h中,列表如下:

#define sighup 

1 /* hangup (posix). 

*/#define sigint 

2 /* interrupt (ansi). 

*/#define sigquit 

3 /* quit (posix). 

*/#define sigill 

4 /* illegal instruction (ansi). 

*/#define sigtrap 

5 /* trace trap (posix). 

*/#define sigabrt 

6 /* abort (ansi). 

*/#define sigiot 

6 /* iot trap (4.2 bsd). 

*/#define sigbus 

7 /* bus error (4.2 bsd). 

*/#define sigfpe 

8 /* floating-point exception (ansi). 

*/#define sigkill 

9 /* kill, unblockable (posix). 

*/#define sigusr1 

10 /* user-defined signal 1 (posix). 

*/#define sigsegv 

11 /* segmentation violation (ansi). 

*/#define sigusr2 

12 /* user-defined signal 2 (posix). 

*/#define sigpipe 

13 /* broken pipe (posix). 

*/#define sigalrm 

14 /* alarm clock (posix). 

*/#define sigterm 

15 /* termination (ansi). 

*/#define sigstkflt 

16 /* stack fault. 

*/#define sigcld 

sigchld 

/* same as sigchld (system v). 

*/#define sigchld 

17 /* child status has changed (posix). 

*/#define sigcont 

18 /* continue (posix). 

*/#define sigstop 

19 /* stop, unblockable (posix). 

*/#define sigtstp 

20 /* keyboard stop (posix). 

*/#define sigttin 

21 /* background read from tty (posix). 

*/#define sigttou 

22 /* background write to tty (posix). 

*/#define sigurg 

23 /* urgent condition on socket (4.2 bsd). 

*/#define sigxcpu 

24 /* cpu limit exceeded (4.2 bsd). 

*/#define sigxfsz 

25 /* file size limit exceeded (4.2 bsd). 

*/#define sigvtalrm 

26 /* virtual alarm clock (4.2 bsd). 

*/#define sigprof 

27 /* profiling alarm clock (4.2 bsd). 

*/#define sigwinch 

28 /* window size change (4.3 bsd, sun). 

*/#define sigpoll 

sigio 

/* pollable event occurred (system v). 

*/#define sigio 

29 /* i/o now possible (4.2 bsd). 

*/#define sigpwr 

30 /* power failure restart (system v). 

*/#define sigsys 

31 /* bad system call. 

*/#define sigunused 

31其中,有乙個訊號是鬧鐘訊號sigalrm,在程式中,我們可以呼叫alarm函式設定乙個超時數值,當超過這個值之後核心將會向該程序傳送sigalrm訊號。按posix的說明,如果不捕獲或者忽略該訊號,預設的動作是終止該程序。但事實上我們一般不會使用預設的動作,而是進行自己的處理。

alarm函式的原型是 unsigned int alarm(unsigned int seconds)

它的引數seconds是超時的秒數,它有返回值。如果上一次使用了alarm函式,並且還沒有到超時時間又使用了alarm函式,它會將上一次設定的seconds返回以便程式對其進行處理。

#include

#include

#include

#include

static short int is_run = 1;

void sig_alarm(int);

int main(int argc, char *argv)

alarm(5);

printf("process will stop after 5 seconds!/n");

while(is_run);

printf("process stop!/n");

return 0; }

void sig_alarm(int seconds)

程式中有乙個空迴圈,條件是is_run。而鬧鐘訊號監聽程式將is_run設定為0從而終止了該迴圈。其結果為:

process will stop after 5 seconds!

process stop!

其中第二句是五秒後才輸出的。

訊號驅動,超時接收

一 訊號驅動。1 訊號驅動原理是什麼?就是使用了系統程式設計中訊號的機制,首先讓程式安裝sigio的訊號處理函式,通過監聽檔案描述符是否產生了sigio訊號,我們就知道檔案描述符有沒有資料到達。如果有資料到達 小明這個客人來了 則系統就會產生了sigio訊號 門鈴響了 我們只需要在訊號處理函式讀取資...

使用 Polly 實現複雜策略 超時重試

第一次接觸 polly 還是在做某個微服務系統的時候,那時只會使用單一的超時策略與重試策略,更加高階的特性就沒有再進行學習了。最近開為某個客戶開發 pc 端的上位機的時候,客戶有個需求,在發起請求之後如果 5 秒鐘沒有響應則進行重試,總共可以重試 3 次,如果 3 次請求都未返回資料,就視為請求失敗...

使用alarm配合訊號實現sleep

author selfimpr blog mail lgg860911 yahoo.com.cn apue中描述solaris 9是使用alarm實現的sleep,其語義如下 如果在sleep之前有乙個未到期的alarm時鐘,則中斷時鐘 下面是乙個簡化的實現,語義為 如果sleep時發現已經有乙個a...