linux alarm函數


(1)引用頭文件:#include <unistd.h>;

(2)函數標准式:unsigned int alarm(unsigned int seconds);

(3)功能與作用:alarm()函數的主要功能是設置信號傳送鬧鍾,即用來設置信號SIGALRM在經過參數seconds秒數后發送給目前的進程。如果未設置信號SIGALARM的處理函數,那么alarm()默認處理終止進程。

(4)函數返回值:如果在seconds秒內再次調用了alarm函數設置了新的鬧鍾,則后面定時器的設置將覆蓋前面的設置,即之前設置的秒數被新的鬧鍾時間取代;當參數seconds為0時,之前設置的定時器鬧鍾將被取消,並將剩下的時間返回

了解了alarm()函數的功能特性和返回值的特性后,我們就可以對其測試。測試方向有兩個:其一,測試常規只單獨存在一個鬧鍾函數alarm()的程序;其二,測試程序中包含多個alarm()鬧鍾函數。

1 alarm測試1

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <signal.h>
 5  
 6 static void sig_alrm(int signo);
 7 int main(void)
 8 {
 9   signal(SIGALRM,sig_alrm);
10   system("date");
11   alarm(20);
12   sleep(5);
13   printf("%d\n",alarm(15));
14   pause();
15 }
16  
17 static void sig_alrm(int signo){
18   system("date");
19   return;
20 }

 測試結果:

程序分析:在test4.c的main()函數中,先設置了一個鬧鍾函數alarm(20),即在20秒時將SIGALRM信號傳送送給當前進程;然后又定義了一個延時函數sleep(5),接着又定義了一個鬧鍾函數alarm(15),它的作用是清除前面設置的鬧鍾alarm(20)並返回剩余的時間20-5=15秒。所以,程序先執行system("date")語句輸出當前時間;然后進程休眠5秒后,程序執行輸出語句printf("%d\n",alarm(15)),由於alarm(15)先返回15秒,即打印輸出15;接着程序執行pause()函數,使當前進程處於掛起狀態,直到捕捉到一個信號;當再過15秒后,SIGALARM信號的處理函數sig_alrm執行system("date")語句輸出當前時間;最后pause終止進程。因此,整個程序執行的時間為5+15=20秒。

2 測試2:

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <signal.h>
 5  
 6 void sig_alarm() 
 7 { 
 8   exit(0); 
 9 } 
10 int main(int argc, char *argv[]) 
11 { 
12   signal(SIGALRM, sig_alarm); 
13   alarm(10); 
14   sleep(5); 
15   printf("Hello World!\n"); 
16   return 0; 
17 }

程序分析:與test1.c文件不同的是,在文件test2.c中延時函數為sleep(5),即執行掛起5秒的時間。所以當main()程序掛起5秒鍾時,由於還沒到達設置的鬧鍾10秒,那么main就執行下面的printf("Hello World!\n")語句;緊接着又執行下面的return 0語句,從而直接退出程序。因此,整個test2.c文件輸出的內容為:Hello World!。

 3 測試3

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <signal.h>
 5  
 6 void handler()
 7 {
 8   printf("hello\n");
 9 }
10  
11 void main()
12 {
13   int i;
14   signal(SIGALRM, handler);
15   alarm(5);
16   for(i = 1; i < 7; i++)
17   {
18     printf("sleep %d ...\n", i);
19     sleep(1);
20   }
21 }

程序分析:在文件test3.c中,定義時鍾alarm(5),而main()函數中主要是一個for循環輸出語句。當main函數執行到i=5時,for循環先執行printf("sleep %d ...\n", 5)語句輸出"sleep 5 ...",然后執行sleep(1)語句。此時已經到達鬧鍾時間5秒,因此會把信號SIGALRM傳送給當前main()函數進程;接着調用SIGALRM信號的處理函數handler,從而輸出"hello",然后又返回到sleep(1)這個點;最后for循環執行i=6,輸出"sleep 6",最終延時1秒后結束整個程序。

以上三個程序都只包含一個alarm()鬧鍾函數,下面兩個程序包含兩個alarm()。並且為了更為真切的觀察包含alarm()鬧鍾函數的程序的執行過程,程序通過調用系統打印輸出當前時間,通過時間差來進一步理解。

4 測試4

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <signal.h>
 5  
 6 static void sig_alrm(int signo);
 7 int main(void)
 8 {
 9   signal(SIGALRM,sig_alrm);
10   system("date");
11   alarm(20);
12   sleep(5);
13   printf("%d\n",alarm(15));
14   pause();
15 }
16  
17 static void sig_alrm(int signo){
18   system("date");
19   return;
20 }

程序分析:在test4.c的main()函數中,先設置了一個鬧鍾函數alarm(20),即在20秒時將SIGALRM信號傳送送給當前進程;然后又定義了一個延時函數sleep(5),接着又定義了一個鬧鍾函數alarm(15),它的作用是清除前面設置的鬧鍾alarm(20)並返回剩余的時間20-5=15秒。所以,程序先執行system("date")語句輸出當前時間;然后進程休眠5秒后,程序執行輸出語句printf("%d\n",alarm(15)),由於alarm(15)先返回15秒,即打印輸出15;接着程序執行pause()函數,使當前進程處於掛起狀態,直到捕捉到一個信號;當再過15秒后,SIGALARM信號的處理函數sig_alrm執行system("date")語句輸出當前時間;最后pause終止進程。因此,整個程序執行的時間為5+15=20秒。

5 測試5

 1 #include <unistd.h>
 2 #include <stdio.h>
 3 #include <stdlib.h>
 4 #include <signal.h>
 5  
 6 static void sig_alrm(int signo);
 7 int main(void)
 8 {
 9   signal(SIGALRM,sig_alrm);
10   system("date");
11   alarm(20);
12   sleep(5);
13   printf("%d\n",alarm(5));
14   pause();
15 }
16  
17 static void sig_alrm(int signo){
18   system("date");
19   return;
20 }

 程序分析:與test4.c文件不同的是,在文件test5.c中鬧鍾函數為alarm(5)。因此,整個程序執行的時間為5+5=10秒。值得注意的是,alarm(0)表示清除之前設置的鬧鍾信號,並返回0。因為,如果這里把alarm(5)改成alarm(0),那么整個程序執行的時間為5+0=5秒。

參考博文:https://blog.csdn.net/u010155023/article/details/51984602


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM