alarm()函数的主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如果未设置信号SIGALARM的处理函数,那么alarm()默认处理终止进程。
1.alarm函数
#include <unistd.h>
unsigned int alarm(unsigned int seconds);
返回值:若前面没有设置定时器或者设置的定时器已经超时返回0,否则返回上一个定时器剩余的秒数,并重新设定定时器。
实例: alarm()默认处理为终止进程。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
int main(int argc, char *argv[])
{
alarm(5);
while (1)
{
printf("this is main()\n");
sleep(1);
}
return 0;
}
运行结果:
[root@iz2zefozq9h39txdb8s7npz shelldemo]# ./a.out
this is main()
this is main()
this is main()
this is main()
this is main()
Alarm clock
我们也可以自定义alarm处理行为。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void sig_handler(int signum)
{
printf("Receive a signal!\n");
}
int main(int argc, char *argv[])
{
signal(SIGALRM,sig_handler);
alarm(5);
while (1)
{
printf("this is main()\n");
sleep(1);
}
return 0;
}
运行结果:
[root@iz2zefozq9h39txdb8s7npz shelldemo]# ./a.out
this is main()
this is main()
this is main()
this is main()
this is main()
Receive a signal!
this is main()
...
实例: 第二个定时器会覆盖第一个定时器。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
int main(int argc, char *argv[])
{
unsigned int sec;
sec = alarm(5);
printf("sec=%d\n",sec);
sleep(3);
sec = alarm(6); //6秒后进程结束
printf("sec=%d\n",sec); //上个定时器还剩下2秒
while (1)
{
printf("this is main()\n");
sleep(1);
}
return 0;
}
运行结果:
[root@iz2zefozq9h39txdb8s7npz shelldemo]# ./a.out
sec=0
sec=2
this is main()
this is main()
this is main()
this is main()
this is main()
this is main()
Alarm clock