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 信号处理函数。
unix环境下,当一个进程以后台形式启动,但尝试去读写控制台终端时,将会触发 SIGTTIN(读) 和 SIGTTOU(写)信号量,接着,进程将会暂停(linux默认),read/write将会返回错误。
这时,shell将会提醒用户切换此进程为前台进程,以便继续执行。后台切换至前台的命令。
前台转为后台则为 CTRL+Z 快捷键
那么如何才能不把进程切换至前台的情况下,读写控制器不会被暂停? 答案:只要忽略 SIGTTIN 和 SIGTTOU 信号量即可
程序结束(terminate)信号,软件终止信号。与SIGKILL不同的是该信号可以被阻塞和处理,通常用来要求程序自己正常退出
内存访问错误导致进程终止。(Segmentation fault)
版权声明:
本文来源网络,所有图片文章版权属于原作者,如有侵权,联系删除。
本文网址:https://www.mushiming.com/mjsbk/2045.html