38-启动定时炸弹 alarm

除了能够使用 kill 函数发信号,本篇再学习一个很重要的信号发送函数 alarm. 该函数不像 kill 函数可以给其它进程发送信号,它只能给自己发信号。另外,它只能发送 SIGALRM 信号。

有同学会问,那要它何用?还不如用 kill 函数呢。其实,alarm 的强大之处在于它可以做到多少秒后发送消息——感觉像极了定时炸弹(不用担心,你的电脑不会爆炸)。

1. alarm 函数

unsigned int alarm(unsigned int seconds);

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 秒被调用一次吗?)

相关推荐
©️2020 CSDN 皮肤主题: 游动-白 设计师:白松林 返回首页