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

  • 3
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值