38-启动定时炸弹 alarm
除了能够使用 kill 函数发信号,本篇再学习一个很重要的信号发送函数 alarm. 该函数不像 kill 函数可以给其它进程发送信号,它只能给自己发信号。另外,它只能发送 SIGALRM 信号。
有同学会问,那要它何用?还不如用 kill 函数呢。其实,alarm 的强大之处在于它可以做到多少秒后发送消息——感觉像极了定时炸弹(不用担心,你的电脑不会爆炸)。
1. alarm 函数
unsigned int alarm(unsigned int
alarm 的参数用来设定多少秒后向本进程发送 SIGALRM 信号。
返回值表示上一次设定的定时炸弹还剩下多少秒的时间会爆炸(同时会取消上一次没来得及爆炸的定时炸弹)。
2. 实例下面这段程序设定了两次定时炸弹,第一次设定 5 秒后爆炸,设定后过了 2 秒,再设定了一个 3 秒后爆炸的定时炸弹。
代码#include <unistd.h>编译和运行
#include <signal.h>
#include <stdio.h>
void handler(int sig) {
if (sig == SIGALRM) printf("Bomb!!!!!!!!\n");
}
int main() {
if(SIG_ERR == signal(SIGALRM, handler)) {
perror("signal SIGALRM");
}
unsigned int remain = 0;
remain = alarm(5); // 设定 5 秒后爆炸
printf("the previous alarm remain %d seconds\n", remain);
sleep(3); // 等待 3 秒
remain = alarm(3); // 设定 3 秒后爆炸,同时会取消前面那个定时炸弹
printf("the previous alarm remain %d seconds\n", remain);
while(1) {
write(STDOUT_FILENO, ".", 1);
pause();
}
}
$ gcc myalarm.c -o myalarm结果
$ ./myalarm
the previous alarm remain 0 seconds3. 总结掌握 alarm 函数的用法对比 kill 和 alarm 函数的区别
the previous alarm remain 2 seconds
.Bomb!!!!!!!!
练习:
你能使用 alarm 函数让你的程序每隔 5 秒打印一次 Bomb!!!!!!!!
吗?(换句话说,你能让你的信号处理函数每隔 5 秒被调用一次吗?)
版权声明
本文仅代表作者观点,不代表博信信息网立场。
上一篇:vue中使用mock的常用方式是怎样的 下一篇:Java 定时任务技术趋势分析