/**
* @file demo6.c
* @Synopsis
*
* #inclue <signal.h>
* typeof void (*sighandler_t)(int);
* sighandler_t signal(int signum,sighandler_t handler);
*
* @author MrClimb
* @version 1.1.0
* @date 2012-05-21
*/
#include <stdio.h>
#include <signal.h>
#include <unistd.h>
#include <string.h>
#define INPUTLEN 100
int main(int argc, char **argv)
{
char input[INPUTLEN];
void siginthandler(int);
void sigquithandler(int);
/* *************************************************************** */
/**
* @Synopsis 这里定义两个捕捉信号。
* Ctrl+C & Ctrl+'\' 两个信号键
* Ctrl+C 发送键盘输入中断
* Ctrl+'\' 发送键盘输入 退出信号
*
* @Param SIGINT
* @Param siginthandler
*/
/* *************************************************************** */
signal(SIGINT,siginthandler);
signal(SIGQUIT,sigquithandler);
do{
memset(input,0,sizeof(input));
ssize_t sst = read(STDIN_FILENO,input,sizeof(input));
if(sst == -1)
{
perror("read failure!");
}
else{
printf("you input value is: %s\n",input);
}
}while(strncmp(input,"quit",4) != 0);
return 0;
}
void siginthandler(int sigint)
{
printf("siginthandler: %d\n",sigint);
sleep(2);
}
void sigquithandler(int sigquit)
{
printf("sigquithandler: %d\n",sigquit);
sleep(2);
}
/**
*
*************result 分析*****************
*
* 当程序a.out 时
* 1:正常输入非exit,则正常输出。
* 2: 当按下 ^C 时程序并没有退出,说明这里的信号被 signal 捕捉,同时调用相应的函数打印结果
* 3: 当按下 ^'\' 同上的结果(说明不是老鼠夹)
* 4: 当连续按 ^C^C^C^C 相同信号时这里只接收一个该信号
* 5: 当连续按 ^'\'^'\'^'\' 也同上只接收一个信号
* 6: 当按 ^C^'\' or ^'\'^C 时候会出现不同结果,只处理后按的那个信号(连续不同信号,优先级处理最后一个,哪个信号
* 在后谁优先级高)
* 7: 当按hello^C 时字符并没有输出来,而是捕捉信号,打印捕捉调用的函数
* 信号与输入交替进行时会把输入给清掉
* (糸统调用执行过程中来信号)输入阻塞过程中来信号{
清除缓冲区
}
*
* // X信号处理过程中又来X信号处理方式{
// 忽略后来
// 等待
// 递归
// }
// X 信号处理过程中又来了Y信号处理方式{
// 先X后Y
// 先Y后X
// }
**************************************
*
*/