系統(tǒng)中的每個進程都有一個私有的鬧鐘。這個鬧鐘很像一個計時器,可以設(shè)置在一定秒數(shù)后鬧鐘。時間一到,時鐘就發(fā)送一個信號SIGALRM到進程。
函數(shù)原型:unsigned int alarm(unsigned int seconds);
頭文件:#include<unistd.h>
函數(shù)說明:
alarm()用來設(shè)置信號SIGALRM在經(jīng)過參數(shù)seconds指定的秒數(shù)后,傳送給目前的進程。如果參數(shù)seconds為0,則之前設(shè)置的鬧鐘會被取消,并將剩下的時間返回。
返回值:如果調(diào)用此alarm()前,進程已經(jīng)設(shè)置了鬧鐘時間,則返回上一個鬧鐘時間的剩余時間,否則返回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(); //讓進程暫停直到信號出現(xiàn)
return EXIT_SUCCESS;
}
運行結(jié)果:
首先打印
Set the alarm and sleep
5秒后打印
Time left before cancel, and
rearm: 5
Hanging around, waiting to die
再經(jīng)過5秒,程序結(jié)束
例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);
}
除非進程為SIGALRM設(shè)置了處理函數(shù),否則信號將殺死這個進程。比較下例中signal(SIGALRM,
wakeup);語句打開與關(guān)閉的區(qū)別。
例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");
}
計時器的另一個用途是調(diào)度一個在將來的某個時刻發(fā)生的動作同時做些其他事情。調(diào)度一個將要發(fā)生的動作很簡單,通過調(diào)用alarm來設(shè)置計時器,然后繼續(xù)做別的事情。當(dāng)計時器計時到0時,信號發(fā)送,處理函數(shù)被調(diào)用。