在linux中测试多个信号,我觉得有俩个问题必须要搞清楚:
(1)如果进程还在处理一个SIGX时候,第二个信号SIGY又到来了,会发生什么呢?
(2)如果消息到来时,程序正在处理read()之类的输入而阻塞,那会如何呢?
先来看断程序:
/*
============================================================================
Name : sigDemo_1.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>
/**
* 多信号处理:主要是针对中断(crl + c) 和 退出 (crl + /)
*
*/
#define SIZE 1000
void inithandler(int s)
{
printf("reveive a signal %d ....waiting/n",s);
sleep(2);
printf("leave inithandler!/n");
}
void quithandler(int s)
{
printf("reveive a signal %d ....waiting/n",s);
sleep(3);
printf("leave quithandler!/n");
}
int main(void) {
int nchars;
char input[SIZE];
signal(SIGINT,inithandler);
signal(SIGQUIT,quithandler);
do{
printf("/nType a message!/n");
nchars = read(0,input,SIZE-1);
if(nchars == -1)
{
perror("read return a error!!!/n");
}
else
{
input[SIZE] = '/0';
printf("you type = %s/n",input);
}
}while(strncmp(input,"end",3)!= 0);
return EXIT_SUCCESS;
}
输入和输出结果:
Type a message!
hel^Creveive a signal 2 ....waiting
leave inithandler!
^Creveive a signal 2 ....waiting
^Cleave inithandler!
reveive a signal 2 ....waiting
^C^C^C^C^Cleave inithandler!
reveive a signal 2 ....waiting
leave inithandler!
^/reveive a signal 3 ....waiting
^/^/^/^/^/^/^/leave quithandler!
reveive a signal 3 ....waiting
leave quithandler!
^Creveive a signal 2 ....waiting
^C^C^Cleave inithandler!
reveive a signal 2 ....waiting
leave inithandler!
lo
you type = lo
Type a message!