最近写程序经用到定时器,每次都是从网上抄一段代码临时替用,每次都了解个皮毛,今天特意收集了一个定时器的应用知识,在这里做一下总结,已备不时之需,
一。采用信号 SIGALRM 方式定时。
常用的四个发出信号的系统函数是kill,raise, alarm和setitimer函数
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;
}
#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;
}