Linux(入门基础):15---信号(1)getitimer、setitimer函数

一、getitimer

#include <sys/time.h>
int getitimer(int which, struct itimerval *curr_value);

**功能:**计时器的当前值填写在curr_value指向的结构体中
备注:
定时器由ITIMER_REAL、ITIMER_VIRTUAL或ITIMER_PROF之一指定
curr_value结构中的it_value字段被设置为计时器上剩余的时间量,如果计时器被禁用,则为零。类似地,it_interval被设置为重置值
参数:
which:间歇计时器类型,为上面介绍的3种定时器种类之一
curr_value:一个struct itimerval结构体类型,保存当前计时器的值
**返回值:**成功返回0;出错返回-1,并设置errno值,常见的错误值如下:
EFAULT:curr_value无效
EINVAL:which参数不是ITIMER_REAL, ITIMER_VIRTUAL,或ITIMER_PROF之一

二、setitimer函数

//头文件
 #include <sys/time.h>

//函数原型
int setitimer(int which, const struct itimerval *new_value,
              struct itimerval *old_value);


struct itimerval {
     struct timeval it_interval; /*间隔,每隔多少时间,周期 */
     struct timeval it_value;    /* 第一次启动时间 */
 };

 struct timeval {
     time_t      tv_sec;         /* seconds秒 */
     suseconds_t tv_usec;        /* microseconds微秒 */
 };

如果it_value为0,那么计时器将不生效
如果计时器it_value过期之后,it_interval为0,那么计时器也将停止工作

ITIMER_REAL(值为0):计时器的值实时递减。计时器超时后,向进程发送SIGALRM信号
ITIMER_VIRTUAL(值为1):当进程在执行的过程中计数,仅在进程执行时递减。计时器超时后,发送SIGVTALRM信号
ITIMER_PROF(值为2):进程和系统执行时都递减计时器的值。这个计时器通常用于分析应用程序在用户和内核空间中花费的时间。计时器超时后,发送SIGPROF信号
将指定的计时器设置为new_value中的值。

代码:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <signal.h>
#include <time.h>
#include <sys/time.h>
#include <errno.h>
 
void sig_func(int signo);
 
int main()
{
    //获取当前时间
    time_t current_time;
    (void)time(&current_time);
 
    //将时间转换为可读的时期和时间格式(struct tm)
    struct tm*tm_ptr;
    tm_ptr=gmtime(&current_time);
    printf("time:%02d:%02d:%2d,main start\n",tm_ptr->tm_hour,tm_ptr->tm_min,tm_ptr->tm_sec);
    
 
    //为SIGALRM信号绑定处理函数
    signal(SIGALRM,sig_func);
    struct itimerval tick;
    tick.it_value.tv_sec = 5;  //计时器首次在5秒之后启动
    tick.it_value.tv_usec = 0;
	
    tick.it_interval.tv_sec  =1; //定时器第一次到时之后,每隔1秒到期一次
    tick.it_interval.tv_usec = 0;
 
    //开启一个计时器,种类为ITIMER_REAL,触发的信号为SIGALRM
    int ret = setitimer(ITIMER_REAL, &tick, NULL);
 
    if ( ret != 0)
    {
        printf("setitimer error:%s \n", strerror(errno) );
        exit(EXIT_FAILURE);
    }
 
	//pause函数:使进程/线程挂起,在接收到一个信号并从信号处理函数返回之后解除挂起操作
    while(1)
        pause();
 
    exit(EXIT_SUCCESS);
}
 
void sig_func(int signo)
{
    time_t current_time;
    (void)time(&current_time);
 
    struct tm*tm_ptr;
    tm_ptr=gmtime(&current_time);
 
    //打印时间和信号ID
    printf("time:%02d:%02d:%2d,recv signal %d\n",tm_ptr->tm_hour,tm_ptr->tm_min,tm_ptr->tm_sec,signo);    
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值