/*
* 当服务器close一个连接时,若client端接着发数据。
* 根据TCP协议的规定,会收到一个RST响应,
* client再往这个服务器发送数据时,系统会发出一个SIGPIPE信号给进程,
* 告诉进程这个连接已经断开了,不要再写了。
* 根据信号的默认处理规则SIGPIPE信号的默认执行动作是terminate(终止、退出),
* 所以client会退出。
* 因此建议应用根据需要处理SIGPIPE信号,至少不要用系统缺省的处理方式处理这个信号,
* 系统缺省的处理方式是退出进程,这样你的应用就很难查出处理进程为什么退出了。
*
* 这个问题只在Linux有,在Windows下没有。
* 若在线程中有对socket发送数据的操作,可将SIGPIPE信号放入阻塞集,即:不发送SIGPIPE信号给线程。
* 这样应用程序就不会被莫名其妙的退出了。
*/
sigset_t signal_mask;
sigemptyset(&signal_mask);
sigaddset(&signal_mask, SIGPIPE);
if ( 0 != pthread_sigmask(SIG_BLOCK, &signal_mask, NULL) )
{
perror("pthread_sigmask");
}
本文探讨了当服务器关闭连接后客户端继续发送数据时遇到的问题。根据TCP协议规定,客户端会接收到RST响应,并由系统发出SIGPIPE信号告知连接已断开。文章详细解释了SIGPIPE信号的默认行为为终止进程,并提出了解决方案,即通过调整信号处理方式来避免进程意外退出。
1849

被折叠的 条评论
为什么被折叠?



