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然後再進入循環。