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; }
運行結果:
首先打印
5秒後打印
再經過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