38-启动定时炸弹 alarm



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

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

1. alarm 函数

unsigned int alarm(unsigned int seconds);
  • 1

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();
  }
}
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22
  • 23
  • 24
  • 25
  • 26
  • 编译和运行
$ gcc myalarm.c -o myalarm
$ ./myalarm
  • 1
  • 2
  • 结果
the previous alarm remain 0 seconds
the previous alarm remain 2 seconds
.Bomb!!!!!!!!
.
  • 1
  • 2
  • 3
  • 4

3. 总结

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

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

猜你喜欢

转载自blog.csdn.net/weixin_38054045/article/details/80898043