/** * @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 // }
************************************** * */