sigaction是POSIX中的信号处理时的设置函数,一个接收到多个消息的进程,如何响应多个信号?需要解决以下四个问题(比前文的多两个)
(1)处理函数每次使用之后都要被禁用吗?
(2)如果SIGY消息再进程处理SIGX消息时,到达会发生什么情况?
(3)如果进程再处理前一个SIGX消息时,另一个SIGX又来到会发生什么情况?
(4)如果消息来到时,程序正在处理read类的输入而阻塞,那会如何?
先看代码:
/*
============================================================================
Name : sigaction_demo.c
Author : free
Version :
Copyright : Your copyright notice
Description : Hello World in C, Ansi-style
============================================================================
*/
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <signal.h>
#include <unistd.h>
#define SIZE 1000
void initHandler(int s)
{
printf("/ncalled signal with %d/n",s);
sleep(s);
printf("done handing signal %d/n",s);
}
int main(void) {
char input[SIZE];
sigset_t blocked;
struct sigaction newHandler;
newHandler.sa_handler = initHandler;
newHandler.sa_flags = SA_RESTART;
sigemptyset(&blocked);
sigaddset(&blocked,SIGQUIT);
newHandler.sa_mask = blocked;//决定在处理一个消息时,是否要阻塞其他信号。
if((sigaction(SIGINT,&newHandler,NULL)) == -1)
{
perror("sigaction wrong!!");
}
else
{
while(1)
{
fgets(input,SIZE,stdin);
printf("intput = %s/n",input);
}
}
return EXIT_SUCCESS;
}
输入输出结果:
hel
intput = hel
^C
called signal with 2
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^Cdone handing signal 2
called signal with 2
done handing signal 2
lo
intput = lo
^C
called signal with 2
^Cdone handing signal 2
called signal with 2
^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^C^/done handing signal 2
called signal with 2
done handing signal 2
退出
sigaddset(&blocked,SIGQUIT);
newHandler.sa_mask = blocked;
被注明阻塞,则SIGY存放在阻塞队列中,直到其他非阻塞信号处理结束之后才执行。
(3)根据输入输出结果,很明显是第二个SIGX被忽略。
(4)先输入“hel”,之后再输入“lo”,最后结果输出“lo”。