sleep與alarm

sleep函數:
#include <unistd.h>
unsigned int sleep(unsigned int seconds);
此函數使調用進程被掛起,直到滿足以下條件之一:
1)已經過了seconds所指定的牆上時鐘時間
2)調用進程捕捉到一個信號並從信號處理程序返回
注:由於其他系統活動,實際返回時間比所要求的會遲一些,像alarm一樣。
sleep的返回值:
1)在上述第一種情形中,返回值是0
2)當由於捕捉到某個信號sleep提前返回時,返回值是未睡夠的時間(所要求的時間減去實際休眠時間)

看看下面的例子,猜猜sleep()的返回值是多少
  1 #include <stdio.h>
  2 #include <time.h>
  3 #include <signal.h>
  4
  5 #define DIAPAUSE 30    //sleep time 30s
  6 #define TIMEOUT 5
  7
  8 void sigalrm(int signo);
  9
 10 int main()
 11 {
 12         struct sigaction sa;
 13
 14         sa.sa_handler = sigalrm;
 15         sa.sa_flags = 0;
 16         sigemptyset(&sa.sa_mask);
 17         if(sigaction(SIGALRM, &sa, NULL) < 0)
 18         {
 19                 printf("sigaction error!\n");
 20                 return;
 21         }
 22
 23         while(1)
 24         {
 25                 printf("alarm(TIMEOUT)...\n");
 26                 alarm(TIMEOUT);
 27                 printf("...\n");
 28                 printf("sleep(DIAPAUSE) == %d\n", sleep(DIAPAUSE));
 29         }
 30
 31         return 0;
 32 }
 33
 34 void sigalrm(int signo)
 35 {
 36         printf("timeout...\n");
 37         return;
 38 }
sleep函數的返回值是25。
如果將TIMEOUT的值改爲大於DIAPAUSE的值,如50的話,sleep函數在睡夠了DIAPAUSE後就會返回,返回值爲0。
如果我們即需要alarm又需要sleep一個預訂的事件怎麼辦?如上面的例子,我想在...後再sleep 30s然後再進入循環。這在socket通訊過程中,在設置超時的時候可能會用到。
注意到alarm函數。
#include <unistd.h>
unsigned int alarm(unsigned int senconds);
使用alarm函數可以設置一個計時器,在將來某個指定的時間該計時器會超時。當計時器超時時,產生SIGALARM信號。如果不捕捉或不忽略此信號,則其默認動作是終止調用該alarm函數的進程。
每個進程只能有一個鬧鐘時鐘,如果在調用alarm時,已經爲該進程設置過鬧鐘時鐘,而且它還沒有超時,則將該鬧鐘時鐘的餘留值作爲本次alarm函數調用的返回值。以前登記的鬧鐘時鐘將被新值代替。
如果有以前爲進程登記的尚未超過的鬧鐘時鐘,而且本次調用的seconds爲0,則取消以前的鬧鐘時鐘,其餘留值仍作爲alarm的返回值。
(以上這幾段話摘自《unix環境高級編程》)。
所以在while循環的printf("...\n");後面添加一句alarm(0);就可以滿足我的要求,即在...後再sleep 30s然後再進入循環。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章