Linux C 定时器 篇(一)

10 篇文章 0 订阅

最近写程序经用到定时器,每次都是从网上抄一段代码临时替用,每次都了解个皮毛,今天特意收集了一个定时器的应用知识,在这里做一下总结,已备不时之需,

一。采用信号  SIGALRM 方式定时。

常用的四个发出信号的系统函数是kill,raise, alarmsetitimer函数

int kill(pid_t pid,int sig);

int raise(int sig);

unisigned int alarm(unsigned int seconds); 

kill系统调用负责向进程发送信号sig.

如果pid是正数,那么向信号sig被发送到进程pid.

如果pid等于0,那么信号sig被发送到所以和pid进程在同一个进程组的进程

如果pid等于-1,那么信号发给所有的进程表中的进程,除了最大的哪个进程号.

如果pid由于-1,0一样,只是发送进程组是-pid.

我们用最多的是第一个情况.还记得我们在守护进程那一节的例子吗?我们那个时候用这个函数杀死了父进程守护进程的创建

raise系统调用向自己发送一个sig信号.我们可以用上面那个函数来实现这个功能的.

alarm函数和时间有点关系了,这个函数可以在seconds秒后向自己发送一个SIGALRM信号.

alarm函数应用:
要注意的是,一个进程只能有一个闹钟时间,如果在调用alarm之前已设置过闹钟时间,则任何以前的闹钟时间都被新值所代替。需要注意的是,经过指定的秒数后,信号由内核产生,由于进程调度的延迟,所以进程得到控制从而能够处理该信号还需要一些时间。
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
static int count; 
int sec = 1;

void DealWithSigalrm(int sig)
{
	count++;
	printf("time out sig :%d       count:%d\n",sig,count);
	alarm(sec);
}
int main()
{
		if(signal(SIGALRM,DealWithSigalrm) == SIG_ERR)
		{
				puts("error regist sigalrm");
				return -1;
		}
	
	    alarm(sec);
	    while(1)
		{
				sleep(100);
		}
	    return 0;
}

kill()函数应用:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include<sys/types.h>
static int count; 
int sec = 1;


void DealWithSigalrm(int sig)
{
	count++;
	printf("time out sig :%d       count:%d\n",sig,count);
}
int main()
{
		if(signal(SIGALRM,DealWithSigalrm) == SIG_ERR)
		{
				puts("error regist sigalrm");
				return -1;
		}
	    while(1)
		{
				kill(getpid(),SIGALRM);
				sleep(sec);
		}
	    return 0;
}

raise()应用:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include<sys/types.h>
static int count; 
int sec = 1;
void DealWithSigalrm(int sig)
{
count++;
printf("time out sig :%d       count:%d\n",sig,count);
}
int main()
{
if(signal(SIGALRM,DealWithSigalrm) == SIG_ERR)
{
puts("error regist sigalrm");
return -1;
}
   while(1)
{
//kill(getpid(),SIGALRM);
raise(SIGALRM);
sleep(sec);
}
   return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值