Linux C系统编程:信号与定时器的使用

版权声明:此文章转载自infocool

原文链接:http://www.infocool.net/kb/Linux/201607/163222.html

如需转载请联系听云College团队成员小尹 邮箱:yinhy#tingyun.com

#include <stdio.h>
#include <signal.h>
void do_alarm(int num);
int main(void)
{
        //注册一个定时器
        if(signal(SIGALRM , do_alarm) == SIG_ERR)
        {
                perror("register alarm fail");
                return -1;
        }
        //alarm
        ////3秒之后发送SIGALRM信号,但是一次性的   SIGALRM信号:定时器的信号
        alarm(3);
        while(1)
        {
                printf("this is in main... \n");
                sleep(3);
        }
        return 0 ;
}
void do_alarm(int num)
{
        printf("this is in alarm ... &*&&\n");
        //会影响sleep
        alarm(1);
}

执行结果:

this is in main... 
this is in alarm ... &*&&
this is in main... 
this is in alarm ... &*&&
this is in main... 
this is in alarm ... &*&&
this is in main... 
......

在<signal.h> 这个头文件中。

signal(参数1,参数2);

参数1:我们要进行处理的信号。系统的信号我们可以再终端键入 kill -l查看(共64个)。其实这些信号时系统定义的宏。

参数2:我们处理的方式(是系统默认还是忽略还是捕获),这里我写了一个处理函数,也就是说这里不是系统默认的。


unsigned int alarm(unsigned int seconds);

参数1:表示指定的秒数。

要注意的是,一个进程只能有一个闹钟时间,如果在调用alarm之前已设置过闹钟时间,则任何以前的闹钟时间都被新值所代替。需要注意的是,经过指定的秒数后,信号由内核产生,由于进程调度的延迟,所以进程得到控制从而能够处理该信号还需要一些时间。如果有以前为进程登记的尚未超时的闹钟时钟,而且本次调用的seconds值是0,则取消以前的闹钟时钟,其余留值仍作为alarm函数的返回值。


以上程序是利用定时器产生的一个信号SIGALRM信号,在收到该信号同时会调用do_alarm函数。这也就类似单片机的定时中断,当定时到了,就跳到中断服务函数里去执行相应的程序。

QQ截图20160713173444.png

想阅读更多技术文章,请访问听云技术博客,访问听云官方网站感受更多应用性能优化魔力。

关于作者

郝淼emily

重新开始,从心开始

我要评论

评论请先登录,或注册