程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> sleep與alarm

sleep與alarm

編輯:關於C++

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

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved