#Header1_HeaderTitle{ font-size:50px }

SIGPIPE,SIGTTIN,SIGTTOU三个信号量的解读

SIGPIPE

TCP是全双工的信道,可以看作两条单工信道,TCP连接的两个端点各负责一条。当对端调用close,虽然本意是关闭整个两条信道,但本端只是收到FIN包。按照TCP协议的语义,表示对端只是关闭了其所负责的那一条单工信道,任然可以继续接收数据。也就是说,因为TCP协议的限制,一个端点无法获知对端的socket是调用了close还是shutdown。

例子:A和B使用TCP传输文件。现在B调用close,清空自己的接收缓存,A 往 B write(发送)数据。

如果接收缓冲已空, 则返回0, 这就是常说的表示连接关闭。但第一次对其调用write方法时,如果 A 发送数据到 B 的缓存没问题,会返回正确写入,但 A 发送的报文会导致B发送RST报文,因为 B 的socket已经调用了close,完全关闭,既不发送,也不接收数据。所以 A 第二次调用write方法(假设在收到 RST 报文之后),会生成 SIGPIPE 信号,导致进程退出。

为了避免进程退出,可以捕获 SIGPIPE 信号,或者忽略它,给他设置 SIG_IGN 信号处理函数。

signal(SIGPIPE, SIG_IGN);

SIGTTIN/SIGTTOU

unix环境下,当一个进程以后台形式启动,但尝试去读写控制台终端时,将会触发 SIGTTIN(读) 和 SIGTTOU(写)信号量,接着,进程将会暂停(linux默认),read/write将会返回错误。

这时,shell将会提醒用户切换此进程为前台进程,以便继续执行。后台切换至前台的命令。

fg

前台转为后台则为 CTRL+Z 快捷键

那么如何才能不把进程切换至前台的情况下,读写控制器不会被暂停? 答案:只要忽略 SIGTTIN 和 SIGTTOU 信号量即可

signal(SIGTTIN, SIG_IGN);
signal(SIGTTOU, SIG_IGN);

SIGINT

终止进程。程序终止(interrupt)信号,通常用户使用 Ctrl + C 发出进程终止信号

SIGKILL

终止进程     杀死进程

SIGTERM

程序结束(terminate)信号,软件终止信号。与SIGKILL不同的是该信号可以被阻塞和处理,通常用来要求程序自己正常退出

SIGSEGV

内存访问错误导致进程终止。(Segmentation fault)

 

posted @ 2020-05-18 09:42  墨麟非攻  阅读(4945)  评论(1编辑  收藏  举报