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.