alarm()函數 Unix/Linux
名稱
alarm - 設置鬧鐘傳遞信號
內容簡介
#include <unistd.h>
unsigned int alarm(unsigned int seconds**);**
描述
alarm() arranges for a SIGALRM signal to be delivered to the process in secondsseconds.
If seconds is zero, no new alarm() is scheduled.
In any event any previously set alarm() is cancelled.
返回值
alarm() 返回剩餘的秒數,直到任何先前預定的報警是由於傳遞或零,如果沒有先前預定的報警。
注意
alarm() and setitimer() share the same timer; calls to one will interfere with use of the other.
sleep() may be implemented using SIGALRM; mixing calls to alarm() and sleep() is a bad idea.
調度延遲,以往一樣,導致執行任意數量的時間被推遲的進程。
系統中的每個進程都有一個私有的鬧鐘。這個鬧鐘很像一個計時器,可以設置在一定秒數後鬧鐘。時間一到,時鐘就發送一個信號SIGALRM到進程。
函數原型:unsigned int alarm(unsigned int seconds);
頭文件:#include<unistd.h>
函數說明: alarm()用來設置信號SIGALRM在經過參數seconds指定的秒數後,傳送給目前的進程。如果參數seconds爲0,則之前設置的鬧鐘會被取消,並將剩下的時間返回。
返回值:如果調用此alarm()前,進程已經設置了鬧鐘時間,則返回上一個鬧鐘時間的剩餘時間,否則返回0。 出錯返回-1。
例1:
int main(int argc, char *argv[]) {
unsigned int timeleft;
printf( "Set the alarm and sleep\n" ); alarm( 10 ); sleep( 5 );
timeleft = alarm( 0 ); //獲得上一個鬧鐘的剩餘時間:5秒 printf( "\Time left before cancel, and rearm: %d\n", timeleft );
alarm( timeleft );
printf( "\Hanging around, waiting to die\n" ); pause(); //讓進程暫停直到信號出現
return EXIT_SUCCESS;
}
運行結果:
首先打印 Set the alarm and sleep
5秒後打印 Time left before cancel, and rearm: 5
Hanging around, waiting to die
再經過5秒,程序結束
除非進程爲SIGALRM設置了處理函數,否則信號將殺死這個進程。比較下例中signal(SIGALRM, wakeup);語句打開與關閉的區別。
例2:
static void timer(int sig) { static int count=0; count++;
printf("\ncount = %d\n", count);
if(sig == SIGALRM) { printf("timer\\n"); }
signal(SIGALRM, timer); alarm(1);
if (count == 5) alarm(0); return; }
int main(int argc, char *argv[]) { signal(SIGALRM, timer); alarm(1); while(1);
}
計時器的另一個用途是調度一個在將來的某個時刻發生的動作同時做些其他事情。調度一個將要發生的動作很簡單,通過調用alarm來設置計時器,然後繼續做別的事情。當計時器計時到0時,信號發送,處理函數被調用。
遵循於
SVr4, POSIX.1-2001, 4.3BSD
另請參閱
gettimeofday (2)
pause (2)
select (2)
setitimer (2)
sigaction (2)
signal (2)