Linux信号-----时钟信号函数(定时器)

前言:

这类函数主要类似于闹钟一样,可以定时的去发送信号,一般用来周期性的操作,就是定时器一样。(注:一般跟信号捕捉函数一起使用)

alarm函数

传送门,请点击

举个简单例子:
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/types.h>
# include <signal.h>

int main(void)
{

	alarm(5);
	while(1){
		printf("I am happy\n");
		sleep(1);
	}
	return 0;
}

在这里插入图片描述


setitimer函数

这个函数跟alarm函数更精确时间,可以精确到微秒,setitimer()有两个功能,一是指定一段时间后,才执行某个function,(此时,跟alarm函数功能几乎一样)二是每间格一段时间就执行某个function

返回值:成功返回0;失败返回-1,并把错误号写到errno变量中

//头文件
#include <sys/time.h>
//函数原型
int setitimer(int which, const struct itimerval *new_value,
            struct itimerval *old_value);

which参数表示类型,可选的值有:
ITIMER_REAL:以系统真实的时间来计算,它送出SIGALRM信号。
ITIMER_VIRTUAL:以该进程在用户态下花费的时间来计算,它送出SIGVTALRM信号。
ITIMER_PROF:以该进程在用户态下和内核态下所费的时间来计算,它送出SIGPROF信号。

new_value和old_value均为itimerval结构体,而结构体里面依然是两个结构体封装

struct itimerval {
struct timeval it_interval; /* next value /
struct timeval it_value; /
current value */
};

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

timeval包含tv_sec和tv_usec两部分,其中tv_se为秒,tv_usec为微秒(即0.0000001秒)
其中的new_value参数用来对计时器进行设置,it_interval为计时间隔,it_value为延时时长,

old_value参数,一般情况下用不上,我们就可以设置为NULL,它就是用来存储上一次setitimer调用时设置的new_value值。

注意:由上面setitimer函数可知,完全可以用来替代alarm这个不精准定时器

举个例子:
# include <stdio.h>
# include <stdlib.h>
# include <unistd.h>
# include <sys/types.h>
# include <signal.h>
# include <sys/time.h>

void catch_sig(int sig){
	printf("I catch the %d siganl\n",sig);
	return ;
}

int main(void)
{
	//第一个表示周期,第二个表示第一次发送信号的时间
	//形成了第一次五秒发送SIGALRM信号,然后每三秒发送信号
	struct itimerval st={{3,0},{5,0}};
	printf("begin...\n");
	setitimer(ITIMER_REAL,&st,NULL);
	signal(SIGALRM,catch_sig);
	while(1);
	return 0;
}

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值