一,alarm()
在將可重新進入函數之前我們先來瞭解下alarm()函數使用:
#include <unistd.h>
unsigned int alarm(unsigned int seconds)
系統調用alarm安排核心為調用進程在指定的seconds秒後發出一個SIGALRM的訊號。如果指定的參數seconds為0,則不再發送 SIGALRM訊號。後一次設定將取消前一次的設定。該調用傳回值為上次定時調用到發送之間剩餘的時間,或者因為沒有前一次定時調用而返回0。
注意,在使用時,alarm只設定為發送一次訊號,如果要多次發送,就要多次使用alarm調用。
man協助說明:
DESCRIPTION
alarm() arranges for a SIGALRM signal to be delivered to the calling
process in seconds seconds.
If seconds is zero, no new alarm() is scheduled.
In any event any previously set alarm() is canceled.
RETURN VALUE
alarm() returns the number of seconds remaining until any previously
scheduled alarm was due to be delivered, or zero if there was no previ-
ously scheduled alarm.
樣本:
#include <unistd.h><sys/stat.h><sys/wait.h><sys/types.h><fcntl.h><stdlib.h><stdio.h><errno.h><.h><signal.h> ERR_EXIT(m) \ ( handler( main( argc, * (signal(SIGALRM, handler) == handler(
結果:
<sys/stat.h><sys/wait.h><sys/types.h><fcntl.h><stdlib.h><stdio.h><errno.h><.h><signal.h> ERR_EXIT(m) \ ( handler( main( argc, *= {, = {, (signal(SIGALRM, handler) ===== handler(
結果:
也是程式建立了一個結構體,設定一個全域變數,然後在main函數中利用兩個局部變數分別給全域變數賦值,由於這個賦值操作是可被中斷的,如以上每一次結構體的賦值可視為兩步:
g_data.a=zeros.a;
g_data.b=zeros.b;
所以當g_data.a=one.a;做完然後被中斷,跑去執行處理函數,在處理函數中調用unsafe_fun()列印全域變數值,可知結果是全域變數a值變了,b值還是之前的沒來的及改變,所以出現了1,0
所以結果不確定