Linux的 Signal 事件用法

本文介绍了一种使用信号处理机制结合定时器实现特定任务的方法。通过注册SIGUSR1和SIGALRM信号处理函数,实现了在指定时间间隔执行的任务,并在接收到SIGALRM信号时停止任务执行。
# kill -l
 1) SIGHUP       2) SIGINT       3) SIGQUIT      4) SIGILL
 5) SIGTRAP      6) SIGABRT      7) SIGBUS       8) SIGFPE
 9) SIGKILL     10) SIGUSR1     11) SIGSEGV     12) SIGUSR2
13) SIGPIPE     14) SIGALRM     15) SIGTERM     17) SIGCHLD
18) SIGCONT     19) SIGSTOP     20) SIGTSTP     21) SIGTTIN
22) SIGTTOU     23) SIGURG      24) SIGXCPU     25) SIGXFSZ
26) SIGVTALRM   27) SIGPROF     28) SIGWINCH    29) SIGIO
30) SIGPWR      31) SIGSYS      34) SIGRTMIN    35) SIGRTMIN+1
36) SIGRTMIN+2  37) SIGRTMIN+3  38) SIGRTMIN+4  39) SIGRTMIN+5
40) SIGRTMIN+6  41) SIGRTMIN+7  42) SIGRTMIN+8  43) SIGRTMIN+9
44) SIGRTMIN+10 45) SIGRTMIN+11 46) SIGRTMIN+12 47) SIGRTMIN+13
48) SIGRTMIN+14 49) SIGRTMIN+15 50) SIGRTMAX-14 51) SIGRTMAX-13
52) SIGRTMAX-12 53) SIGRTMAX-11 54) SIGRTMAX-10 55) SIGRTMAX-9
56) SIGRTMAX-8  57) SIGRTMAX-7  58) SIGRTMAX-6  59) SIGRTMAX-5
60) SIGRTMAX-4  61) SIGRTMAX-3  62) SIGRTMAX-2  63) SIGRTMAX-1
64) SIGRTMAX

 

View Code
   //start  
   #include <signal.h>  
   #include 
<sys/time.h>  
   #include 
<stdio.h>  
   #include 
<stdlib.h>  
   
static void sighandler(int sigty);  
   
bool goon=true;  
   
int tot,last;  
   
int main(){  
   
struct itimerval v;  
   
if (signal(SIGUSR1,sighandler)==SIG_ERR){  
   printf(
"error on reg");  
   exit(
1);  
   }  
   
if (signal(SIGALRM,sighandler)==SIG_ERR){  
   printf(
"error on reg");  
   exit(
2);  
   }  
   v.it_value.tv_sec
=3//定时3秒  
   v.it_value.tv_usec=0;  
   v.it_interval.tv_sec
=0;//只做一次  
   v.it_interval.tv_usec=0;  
   setitimer(ITIMER_REAL,
&v,NULL); //定时器 
   printf("timer has be seted\n");  
   tot
=0;  
   last
=v.it_value.tv_sec;  
   goon
=true;  
   
while (goon){  
   getitimer(ITIMER_REAL,
&v);  
   
int now = v.it_value.tv_sec;  
   
//printf("now: %d\n",now);  
   if (now==last-1){  
   raise(SIGUSR1);  
   tot
++;  
   }  
   last
=now;  
   }  
    
   
return 0;  
   }  
   
static void sighandler(int sigty){  
   
if (sigty==SIGUSR1){  
   
struct itimerval v;  
   getitimer(ITIMER_REAL,
&v);  
   printf(
"real time: %ld sec %ld\n",v.it_value.tv_sec ,v.it_value.tv_usec  );  
   }
else if (sigty==SIGALRM){  
   printf(
"timer stop\n");  
   goon
=false;  
   }  
   }  
   
//end  

转载于:https://www.cnblogs.com/no7dw/archive/2011/05/18/2049502.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值