linux c編程:信號(二) alarm和pause函數


使用alarm函數可以設置一個定時器,在將來的某個時刻該定時器超時。當定時器超時后,產生SIGALRM信號。如果忽略或不捕捉此信號,則其默認動作是終止調用該alarm函數的進程

#include<unistd,h>

unsigned int alarm(unsigned int seconds);

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

 

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

來看下面的幾個測試:

void sig_alarm(){

    printf("sig_alarm");

    exit(0);

}

 

void signal_func1(){

    signal(SIGALRM,sig_alarm);

    alarm(10);

    sleep(15);

    printf("hello world\n");

    return 0;

}

 

定義了一個時鍾alarm(10),它的作用是讓信號SIGALRM在經過10秒后傳送給目前signal_func1所在進程;接着又定義了sleep(15),它的作用是讓執行掛起15秒的時間。所以當signal_func1程序掛起10秒鍾時,signal函數調用SIGALRM信號的處理函數sig_alarm,並且sig_alarm執行exit(0)使得程序直接退出。因此,printf("Hello World!\n")語句是沒有被執行的。

如果改成sleep(5),掛起只有5秒的時間。那么就可以在發送信號前執行打印hello world

pause函數:

作用:調用進程掛起直至捕捉到一個信號。只有執行了一個信號處理程序並從其返回時,pause才返回。在這種情況下,pause返回-1.

我們來看下alarmpause結合的例子:

void sig_alarm(){

    system("date");

    return;

}

void signal_func1(){

    signal(SIGALRM,sig_alarm);

    system("date");

    alarm(20);

    sleep(5);

    printf("%d\n",alarm(15));

    pause();

}

每個進程只有一個鬧鍾時間,如果在調用alarm的時候,之前已為該進程注冊的鬧鍾時間還沒有超過時,則該鬧鍾時間的余留值作為本次alarm函數調用的值返回。以前注冊的鬧鍾時間則被新值代替

來看下面的實現:

void sig_alarm(){

    system("date");

    return;

}

 

void signal_func1(){

    signal(SIGALRM,sig_alarm);

    system("date");

    alarm(20);

    sleep(5);

    printf("%d\n",alarm(15));

    pause();

}

先設置了一個鬧鍾函數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秒。

 


免責聲明!

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



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