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