Posox信号语义
Posix允许我们制定这样的一组信号,它们在信号处理程序被调用时阻塞。任何阻塞的信号都不能递交给进程。我们设置sa_mask为空集,这意味着当信号处理程序运行时没有别的信号阻塞。这句话特别不好理解,而且是让人产生误解。正确认识这句话的关键在于理解sa_mask集是什么,添加到sa_mask集中的函数会被屏蔽(其实就是上面所说的阻塞),当我们正在设置handle函数在运行的时候,如果发送的sa_mask中包括的信号,那么这些被屏蔽的信号会被屏蔽,也就是不能提交给进程。所以上文比较好理解的意思是:
Posix允许我们制定这样的一组信号,它们在信号处理程序(这里的信号指的是handle的信号不是别屏蔽的信号)被调用时被屏蔽。任何被屏蔽的信号都不能递交给进程。我们设置sa_mask为空集,这意味着当信号处理程序运行时没有别的信号被该信号屏蔽。
#include <signal.h>
#include <stdio.h>
#include <math.h>
#include <stdlib.h>
static void sig_alarmFun(int signo)
{
int i;
i=0;
printf("--got a sigalrm--\n");
while(i < 5)
{
printf("--alarm--\n");
fflush(stdout);
sleep(1);
i++;
} fflush(stdout);
}
static void sig_intFun(int signo)
{
int i;
i=0;
printf("--got a sigint--\n");
while(i < 5)
{
printf("--sleeping--\n");
fflush(stdout);
sleep(1);
i++;
}
}
int main(int argc, char **argv)
{
struct sigaction act, oact;
act.sa_handler = sig_intFun;
sigemptyset(&act.sa_mask);
//已经设置在SIGINT处理函数期间阻塞SIGALRM信号
sigaddset(&act.sa_mask, SIGALRM);
sigemptyset(&act.sa_mask);
act.sa_flags = SA_RESTART | SA_RESETHAND;
sigaction(SIGINT, &act, &oact);
alarm(5);
act.sa_handler = sig_alarmFun;
//屏蔽所有的信号
sigfillset(&act.sa_mask);
//清空所以被屏蔽的信号
//sigemptyset(&act.sa_mask);
act.sa_flags = SA_RESTART | SA_RESETHAND;
sigaction(SIGALRM, &act, &oact);
while(1)
{
printf("---test---\n");
fflush(stdout);
sleep(1);
}
return 0;
在这个例子中,int中断屏蔽的alarm中断。而alarm没有屏蔽int中断。所以在运行在alarm期间如果按下ctol-c会进入会进入int信号处理程序,而在int中断期间如果发送alarm信号则不会进入进入alarm信号处理程序,直到int信号处理程序运行完毕。