Linux 定時器alarm()

2puT發表於2016-07-23

系統中的每個程式都有一個私有的鬧鐘。這個鬧鐘很像一個計時器,可以設定在一定秒數後鬧鐘。時間一到,時鐘就傳送一個訊號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, andrearm: 5

          Hanging around, waiting to die

再經過5秒,程式結束


例2:

static voidtimer(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);

}

 

除非程式為SIGALRM設定了處理函式,否則訊號將殺死這個程式。比較下例中signal(SIGALRM,wakeup);語句開啟與關閉的區別。

例3:

void wakeup()
{
 printf("Wake Up!\n");
}

void main(int argc,char *argv[])
{
 printf("sleep 3 seconds!\n");
 //signal(SIGALRM, wakeup);
 alarm(3);
 pause();
 printf("Waken!\n");
}

 

計時器的另一個用途是排程一個在將來的某個時刻發生的動作同時做些其他事情。排程一個將要發生的動作很簡單,通過呼叫alarm來設定計時器,然後繼續做別的事情。當計時器計時到0時,訊號傳送,處理函式被呼叫。

相關文章