linux之setitimer函数结合signal函数实现alarm函数的作用

本文详细介绍了Linux中用于定时的alarm、signal和setitimer函数。通过示例代码展示了如何使用它们来设置定时器,并在指定时间后触发SIGALRM信号,调用自定义的信号处理函数。setitimer提供了更高的精度,能够实现周期性定时任务。在代码示例中,每隔5秒首次打印'helloworld',之后每3秒打印一次。
摘要由CSDN通过智能技术生成

1.alarm函数

a.原型:unsigned int alarm(unsigned int seconds);

b.返回值:返回 0 或上一个 alarm 剩余的秒数,无失败。

c.作用:设置定时器(闹钟)。在指定 seconds 后,内核会给当前进程发送 14)SIGALRM 信号。进程收到该信号,默认动作终止。

2.signal 函数:

原型:sighandler_t signal(int signum, sighandler_t handler);

作用:注册一个信号捕捉函数:

3.setitimer函数

原型:int setitimer(int which, const struct itimerval *new_value, struct itimerval *old_value);

a.参数:

        which:指定定时方式

                常用:自然定时: ITIMER_REAL → 14)SIGLARM-------------计算自然时间

        struct itimerval的结构:

struct itimerval{
	struct timeval{
		it_interval.tv_sec;
		it_interval.tv_usec;
	}it_interval;

	struct timeval{
		it_value.tv_sec;
		it_value.tv_usec;
	}it_value;
}it,oldit;

 

        it_interval:用来设定两次定时任务之间间隔的时间。

        it_value:定时的时长 

b.返回值:成功: 0;失败: -1,设置 errno

c.作用:设置定时器(闹钟)。 可代替 alarm 函数。精度微秒 us,可以实现周期定时。

代码:setitimer1.c

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


void myfunc(int signo)
{
	printf("hello world\n");
}


int main()
{
	struct itimerval it,oldit;
	//捕捉到SIGALRM信号后,执行myfunc函数,signal函数的作用只是注册myfunc函数,
	//真正捕捉信号的是内核,调用myfunc函数的也是内核
	//信号捕捉函数是一个典型的回调函数
	signal(SIGALRM,myfunc);		//注册SIGALRM信号的捕捉处理函数
	
	//sighandler_t tml = signal(SIGALRM,myfunc);
	
	it.it_value.tv_sec = 5;//定时5秒
	it.it_value.tv_usec = 0;
	
	it.it_interval.tv_sec = 3;//第一个闹钟和第二个闹钟的时间间隔是3秒
	it.it_interval.tv_usec = 0;
	
	//5秒之后,发送SIGALRM信号
	if(setitimer(ITIMER_REAL,&it,&oldit)==-1){
		perror("setitimer error");
		return -1;
	}
	
	while(1);
	return 0;
	
}
//执行结果:5秒之后打印第一个hello world,之后都是3秒打印一个hello world

结果:5秒之后打印第一个hello world,之后都是3秒打印一个hello world

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值