linux系统下alarm函数详解 信号处理函数signal

alarm()函数说明
1.引用头文件:#include <unistd.h>;

2.函数标准式:unsigned int alarm(unsigned int seconds);

3.功能与作用:alarm()函数的主要功能是设置信号传送闹钟,即用来设置信号SIGALRM在经过参数seconds秒数后发送给目前的进程。如果未设置信号SIGALARM的处理函数,那么alarm()默认处理终止进程。

4.函数返回值:如果在seconds秒内再次调用了alarm函数设置了新的闹钟,则后面定时器的设置将覆盖前面的设置,即之前设置的秒数被新的闹钟时间取代;当参数seconds为0时,之前设置的定时器闹钟将被取消,并将剩下的时间返回。

下面的示例中,都运用了信号处理函数signal(signum,handler),用于修改和信号相关联的默认行为,只要接收到类型为signum的信号,就会调用信号处理程序。(不过signal函数有三种方式,handler是SIG_IGN SIG_DFL 用户定义的函数地址,这里采用的都是第三种方式)

示例1:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void sig_handler(int num)
{
    printf("receive the signal %d.\n", num);
}
int main()
{
    signal(SIGALRM, sig_handler); //SIGALRM是在定时器终止时发送给进程的信号
    alarm(2);
     pause();//pause()函数使该进程暂停让出CPU
    exit(0);
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

运行结果:
两秒钟后输出 :
在这里插入图片描述

示例2:
如果我们想程序每2秒都定时一下,这样实现也很简单,我们在处理定时信号的函数中再次定时2秒;实例如下:

#include<stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
void sig_handler(int num)
{
    printf("receive the signal %d.\n", num);
    alarm(2);
}
int main()
{
    signal(SIGALRM, sig_handler);
    alarm(2);
    while(1)//做一个死循环,防止主线程提早退出,相等于线程中的join
    {
        pause();
    }
    //pause();//如果没有做一个死循环则只会让出一次cpu然后就还给主线程,主线程一旦运行结束就会退出程序
    exit(0);
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20
  • 21
  • 22

运行结果:
在这里插入图片描述

示例3:

#include<unistd.h>
#include<signal.h>
void handler() {
printf("hello/n");
}
main()
{
int i;
signal(SIGALRM,handler);
alarm(5);
for(i=1;i<7;i++){
printf("sleep %d .../n",i);
sleep(1);
}
}

   
   
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15

输出:

sleep 1 ...
sleep 2 ...
sleep 3 ...
sleep 4 ...
sleep 5 ...
hello
sleep 6 ...

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值