最近再看unix编程的书籍,理解下操作系统。对于sinal信号的毛病的形容有一些似懂非懂的中央,就依照例子做一个试验,看看零碎如何解决。代码如下:
#include <stdio.h>#include <signal.h>#include <unistd.h>#include <string.h>#define INPUTLEN 100void inthandler(int s){ printf("received a signal %d\n",s); sleep(2); printf("leaving inthandler\n");}void quithandler(int s){ printf("received a signal %d\n",s); sleep(3); printf("leaving quithandler\n");}int main(int ac,char *av[]){ char input[INPUTLEN]; int nchars; signal(SIGINT,inthandler); signal(SIGQUIT,quithandler); do{ printf("\n type a message\n"); nchars=read(0,input,(INPUTLEN-1)); if(nchars==-1) perror("read return an error"); else{ input[nchars]='\0'; printf("you typed ,%s",input); } }while(strncmp(input,"quit",4)!=0);}
测试场景(在centos7 零碎下测试):
- 间断屡次中断信号
通过上图的演示,在收回第一个中断信号后,捕捉信号处理。在屡次收回终端信号后,信号被阻塞,信号处理程序处理实现后,梗塞的雷同的信号被捕捉一次。
2.距离发送中断信号和QUIT信号
发送一个中断信号后,零碎捕捉信号处理。在收回一个QUIT信号后,从中断信号处理的函数跳转导QUIT信号处理函数解决。
3、被中断的零碎调用
当输出“hello” 后产生了中断,中断实现后输出“world n",最初只打印出 "world".看来在centos,并不是在read 时产生中断返回-1.