linux setitimer

setitimer()为Linux的API,并非C语言的Standard Library,setitimer()有两个功能,一是指定一段时间后,才执行某个function,二是每间格一段时间就执行某个function,以下程序demo如何使用setitimer()。

 

 

Synopsis    : #include <sys/time.h> 
 
              int setitimer(int which, const struct itimerval *value, struct itimerval *ovalue); 
 
              struct itimerval { 
 
                struct timerval it_interval; 
 
                struct timerval it_value; 
 
              }; 
 
  
 
              struct timeval { 
 
                long tv_sec; 
 
                long tv_usec; 
 
              }        

 

 

 

void printMsg(int);  
  
  
  
int main() {  
  
  // Get system call result to determine successful or failed  
  
  int res = 0;  
  
  // Register printMsg to SIGALRM  
  
  signal(SIGALRM, printMsg);  
  
    
  
  struct itimerval tick;  
  
  // Initialize struct  
  
  memset(&tick, 0, sizeof(tick));  
  
  // Timeout to run function first time  
  
  tick.it_value.tv_sec = 1;  // sec  
  
  tick.it_value.tv_usec = 0; // micro sec.  
  
  // Interval time to run function  
  
  tick.it_interval.tv_sec = 1;  
  
  tick.it_interval.tv_usec = 0;  
  
  // Set timer, ITIMER_REAL : real-time to decrease timer,  
  
  //                          send SIGALRM when timeout  
  
  res = setitimer(ITIMER_REAL, &tick, NULL);  
  
  if (res) {  
  
    printf("Set timer failed!!/n");  
  
  }  
  
  
  
  // Always sleep to catch SIGALRM signal  
  
  while(1) {  
  
    pause();  
  
  }  
  
  
  
  return 0;    
  
}  
  
  
  
void printMsg(int num) {  
  
  printf("%s","Hello World!!\n");  
  
}  

 

 

 

 

 

 

 

当setitimer()所执行的timer时间到了,会呼叫SIGALRM signal,所以在第30行用signal()将要执行的function指定给SIGALRM。 在第43行呼叫setitimer()设定timer,但setitimer()第二个参数是sturct,负责设定timeout时间,所以第36行到第 40行设定此struct。itimerval.it_value设定第一次执行function所延迟的秒数, itimerval.it_interval设定以后每几秒执行function,所以若只想延迟一段时间执行function,只要设定  itimerval.it_value即可,若要设定间格一段时间就执行function,则it_value和it_interval都要设定,否则 funtion的第一次无法执行,就别说以后的间隔执行了。 第36行和第39行的tv_sec为sec。 第43行的第一个参数ITIMER_REAL,表示以real-time方式减少timer,在timeout时会送出SIGALRM signal。第三个参数会存放旧的timeout值,如果不需要的话,指定NULL即可。 第47 行的pause(),命令系统进入sleep状态,等待任何signal,一定要用while(1)无穷循环执行pause(),如此才能一直接收 SIGALRM signal以间隔执行function,若拿掉while(1),则function只会执行一次而已。

 

信号阻塞与屏蔽:SIG_BLOCK, SIG_UNBLOCK, SIG_MASK区别与使用


1. sigprocmask函数提供屏蔽和解除屏蔽信号的功能。
   从而实现关键代码的运行不被打断。
 
   函数声明如下:  

     #include 
      int sigprocmask(int how, const sigset_t *set, sigset_t *oldset);
 
   其中参数 how可设置的参数为:SIG_BLOCK, SIG_UNBLOCK,SIG_SETMASK
 
   SIG_BLOCK:
        按照参数  set 提供的屏蔽字,屏蔽信号。并将原信号屏蔽保存到oldset中。
            
   SIG_UNBLOCK:
     按照参数  set 提供的屏蔽字进行信号的解除屏蔽。针对Set中的信号进行解屏。
     
   SIG_SETMASK:
     按照参数  set 提供的信号设置重新设置系统信号设置。

2. 信号屏蔽与解屏常见实现

   方法一: SIG_BLOCK, SIG_UNBLOCK成对实现
   优点oldset可以不管。
   
   方法二:
   SIG_BLOCK设置屏蔽,保存原有信号设置。
   SIG_SETMASK重新恢复原有设置。
   
3. 屏蔽过程中接受到的信号如何处理
   在信号屏蔽过程中,出现的所有被屏蔽的信号,不管发生多少次,
   在信号解除屏蔽后,系统会执行一次被屏蔽信号上的操作。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值