管道破裂。这个信号通常在进程间通信产生,比如采用FIFO(管道)通信的两个进程,读管道没打开或者意外终止就往管道写,写进程会收到SIGPIPE信号。此外用Socket通信的两个进程,写进程在写Socket的时候,读进程已经终止。
****在做一个WEB服务器项目的时候,程序基本功能已经实现,但是在windows上使用Chrome浏览器访问时,正常运行一段时间后,服务端的程序异常结束,调试了一早上,没有找到问题,使用gdb找到了错误管道破裂,然后在错误的地方发现了一个共同点,都有conn这个参数,但是看不懂错误的意思,想不到socket套接字出现了问题。发现是浏览器的问题,浏览器的套接字关闭了,但是服务器还在往套接字发文件,导致管道破裂,服务端进程结束。
解决方法:是忽略SIGPIPE信号(使用信号处理函数,handler函数什么也不执行),然后判断send的返回值,如果返回-1,表示发送失败,重新连接(即结束这个被调函数(return 1),程序会进入下一次while循环,因为没有发送(写端)时,浏览器(客户端)并不会关闭,只会不断发送申请报文,等待服务端的响应报文(文件));****
我们需要在send的时候检测到服务器已经关闭连接,进行重新连接。正常情况下send函数返回-1表示发送失败,但是在IOS上SIGPIPE在send返回之前就终止了进程,所以我们需要忽略SIGPIPE,让send正常返回-1,然后重新连接服务器。
参考:https://blog.csdn.net/jia12216/article/details/50844013?ops_request_misc=%25257B%252522request%25255Fid%252522%25253A%252522161199114916780262545837%252522%25252C%252522scm%252522%25253A%25252220140713.130102334.pc%25255Fall.%252522%25257D&request_id=161199114916780262545837&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2allfirst_rank_v2~rank_v29-1-50844013.pc_search_result_before_js&utm_term=%25E5%25BF%25BD%25E7%2595%25A5%25E5%25A5%2597%25E6%258E%25A5%25E5%25AD%2597%25E7%259A%2584%25E7%25AE%25A1%25E9%2581%2593%25E7%25A0%25B4%25E8%25A3%2582