C_Linux编程_信号_3、定时器setitimer&alarm&signal函数

1、简单的alarm函数

我们为他设置了6秒的生命周期。

 

#include <stdio.h>
#include <unistd.h>

main(int argc, char const *argv[])
{
    int ret = 0;
    //放置一个闹钟,当6秒过后就会提示
    ret = alarm(6);
    printf("ret = %d\n",ret);
    while(1){
        printf("da wo a \n");
        sleep(1);
    }

    return 0;
}

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

 

2、setitimer函数

setitimer(ITIMER_REAL,&myit,NULL);

主要是myit参数的设定

#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
main(int argc, char const *argv[])
{
    
/*

struct itimerval {
               struct timeval it_interval; //间隔it_interval秒后再次响应
               struct timeval it_value; //it_value秒后开始执行
           };
struct timeval {
               long tv_sec;//秒 
               long tv_usec; //微秒
           };

*/
    struct itimerval myit={{0,0},{3,0}};//3秒后开启
    /*
    开启定时器,ITIMER_REAL代表实时递减,时间到后会发出响应。
    */
    setitimer(ITIMER_REAL,&myit,NULL);
    while(1){
        printf("ha\n");
        sleep(1);
    }
    return 0;
}

当然这里面也没有信号signal()函数,最后也会结束。

 

然后让我们在里面加入信号signal函数,在catch_sig()函数里我们输出一个字符串。

C 库函数 void (*signal(int sig, void (*func)(int)))(int) 设置一个函数来处理信号,即带有 sig 参数的信号处理程序。

  • sig -- 在信号处理程序中作为变量使用的信号码。下面是一些重要的标准信号常量:
信号
SIGABRT(Signal Abort) 程序异常终止。
SIGFPE(Signal Floating-Point Exception) 算术运算出错,如除数为 0 或溢出(不一定是浮点运算)。
SIGILL(Signal Illegal Instruction) 非法函数映象,如非法指令,通常是由于代码中的某个变体或者尝试执行数据导致的。
SIGINT(Signal Interrupt) 中断信号,如 ctrl-C,通常由用户生成。
SIGSEGV(Signal Segmentation Violation) 非法访问存储器,如访问不存在的内存单元。
SIGTERM(Signal Terminate) 发送给本程序的终止请求信号。

     

  • func -- 一个指向函数的指针。它可以是一个由程序定义的函数,也可以是下面预定义函数之一:
  • SIG_DFL默认的信号处理程序。
    SIG_IGN忽视信号。
  • 两个特殊的参数,也可以自己写程序(信号处理函数的原型必须为void func(int))来代替。
#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
#include <signal.h>

//
void catch_sig(int num){
    printf("cat %dsig\n",num);
}
main(int argc, char const *argv[])
{
    signal(SIGALRM,catch_sig);
    //第一次等待五秒,之后每隔三秒发送一次信号。
    struct itimerval myit = {{3,0},{5,0}};
    setitimer(ITIMER_REAL,&myit,NULL);
    while(1){
        printf("ha\n");
        sleep(1);
    }

    return 0;
}

让我们再来看看结果

 

最后我们自己优化一下定时函数,让他可以输出剩余时间。

#include <stdio.h>
#include <sys/time.h>
#include <unistd.h>
#include <signal.h>

/*

参数:seconds:设置起始时间
printf输出当下剩余的时间
*/
unsigned int myalarm(unsigned int seconds){
    //{周期性定时秒:微秒},{下一次时间秒:微秒}
    struct itimerval oldit,myit = {{0,0},{0,0}};
    myit.it_value.tv_sec = seconds;

    setitimer(ITIMER_REAL,&myit,&oldit);
    printf("tv_sec = %ld,tv_mirsrc%ld\n",oldit.it_value.tv_sec,oldit.it_value.tv_usec);
    return oldit.it_value.tv_sec;
}
main(int argc, char const *argv[])
{
    int ret = 0;
    ret = myalarm(4);
    printf("ret = %d\n",ret);
    sleep(1);
    //返回剩余的时间
    ret = myalarm(4);
    printf("ret = %d\n",ret);
    while(1){
        printf("lai da wo\n");
        sleep(1);
    }
    /* code */
    return 0;
}

代码跑完。当我们睡眠1秒后我们剩余的时间还有接近3秒,最后输出了三次lai da wo。

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值