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

另請參閱