在你的Linux系统中,一个进程是如何响应多个信号的?
做个小实验~上代码。
#include<stdio.h> #include<signal.h> #define INPUTLEN (100) int main(int ac, char* av[]) { void inthandler(int); void quithandler(int); char input[INPUTLEN]; int nchars; signal(SIGINT, inthandler); signal(SIGQUIT, quithandler); do{ printf("\nType a message\n"); nchars = read(0, input, (INPUTLEN-1)); if(nchars == -1) perror("read returned an error"); else { input[nchars] = '\0'; printf("You typed: %s", input); } }while(strncmp(input, "quit", 4) != 0); } void inthandler(int s) { printf("Received signal %d.. waiting\n", s); sleep(2); printf("Leaving inthandler\n"); } void quithandler(int s) { printf("Received signal %d .. waiting \n", s); sleep(3); printf("Leaving quithandler\n"); }
流程很简单,为SIGINT,SIGQUIT设定信号处理函数,主程序一直循环,接收来自stdin的输入,直到接收到"quit"结束。
SIGINT 信号,可以由ctrl+c 来产生,SIGQUIT信号,可以由 ctrl+\ 来产生。编译之后,来看现象。
1、SIGINT+SIGINT+SIGINT+SIGINT(多个相同信号)
笔者的系统是Ubuntu9.10,连续发送4个SIGINT后,系统先处理一个,再阻塞一个,忽略后两个。处理完第一个后,阻塞的才被处理。SIGQUIT同样效果。