日期:2014-05-16  浏览次数:20587 次

sigaction如何设置信号执行函数时屏蔽和屏蔽本身信号.
我想做个测试例题,如何设置sa_mask让信号函数执行时,可以屏蔽和不屏蔽本身信号.
测试代码如下:
#include <stdio.h>
#include <stdlib.h>
#include <errno.h>
#include <time.h>  
#include <sys/time.h> 
#include <sys/types.h>  
#include <signal.h>
#include <unistd.h>  

static void catch_signal(int);

int main(int argc, char* argv[])
{
struct sigaction act;
struct itimerval value;
act.sa_handler = catch_signal; //设置信号处理函数
  act.sa_flags = 0; //设置信号处理标志位
  sigemptyset(&act.sa_mask); //清空信号集,信号函数执行过程不屏蔽本身信号 ==1==
  sigaction(SIGALRM,&act,NULL); //捕获定时信号


  //设置一个定时器,1s发送一个定时信号
  value.it_value.tv_sec=1;  
  value.it_value.tv_usec=0;  
  value.it_interval.tv_sec = 1; 
  value.it_interval.tv_usec = 0;  
  if(setitimer(ITIMER_REAL,&value,NULL)<0){
perror("setitimer");
  }

while(1){  
  pause(); //让进程暂停直到信号的出现
  }  
return 0;
}

//所有信号处理函数
static void catch_signal(int signo)
{
printf("SIGALRM \n");
sleep(5); //用于测试函数执行过程是否会屏蔽本身信号,如果1s输出一次说明未屏蔽
  //如果5s输出一次说明已屏蔽
  return;
}


1.但在实际测试当中发现,不管我注释 sigemptyset(&act.sa_mask); 这行,还是不注释该行,都是5s输出一次,
但我想在信号函数执行时不屏蔽本身信号应该怎么做呢(也就是1s就输出一次).

2.我还试过signal(SIGALRM,catch_signal);直接signal来设置信号处理函数,发现都是5s输出一次,那是否说明signal设置在信号处理函数时,屏蔽了本身信号.

3.还是说我的测试方法误????????????

欢迎大家指点,谢谢.....

------解决方案--------------------
因为sleep不会返回-1, 也不会设置errno,
但是pause()和nanosleep会,行为和read一样.
也许是历史原因sleep时收到信号确实不会重启.
#include <unistd.h>
unsigned int sleep(unsigned int seconds);

 RETURN VALUE

If sleep() returns because the requested time has elapsed, the value returned will be 0. If sleep() returns because of premature arousal due to delivery of a signal, the return value will be the "unslept" amount (the requested time minus the time actually slept) in seconds. 

 ERRORS

No errors are defined.