訊號是軟體中斷,能夠提供一種處理非同步事件的方法。
這些訊號被定義在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...