今天要写一个linux下C/S模式程序,然后就遇见一个问题。
服务器端是被动连接的,然后准备让多个Client端连接,Socket在Client异常中断的情况下。服务器端也会随之中断。
根据网络搜索的结果,这个一般是由于向一个被破坏的socket连接或者pipe读写数据造成的,说这种场景不会出现SIGPIPE信号,而是直接send, write, sendmsg等返回-1,同时errno会被设置成EPIPE。
根据测试,向一个被破坏了的socket发送或者接受时。确实会出现SIGPIPE信号,然后程序随之中断。
所以解决办法就有了:
1.client中忽略SIGPIPE信号
signal(SIGPIPE, SIG_IGN);
然后判断返回值与errno标志确定是否退出或者做其他处理
2.阻止SIGPIPE信号
sigset_t
set;
sigemptyset(&
set);
sigaddset(&
set, SIGPIPE);
sigprocmask(SIG_BLOCK, &
set, NULL);
3 为SIGPIPE添加信号处理函数,处理完程序继续执行
signal(SIGPIPE, pipesig_handler);
单个线程退出即可。
转载请注明原文地址: https://ju.6miu.com/read-1312129.html