除了能够使用 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 seconds
the previous alarm remain 2 seconds
.Bomb!!!!!!!!

3. 总结

  • 掌握 alarm 函数的用法
  • 对比 kill 和 alarm 函数的区别

练习:
你能使用 alarm 函数让你的程序每隔 5 秒打印一次 ​​​Bomb!!!!!!!!​​ 吗?(换句话说,你能让你的信号处理函数每隔 5 秒被调用一次吗?)