socket编程中经常会遇到这样一种情况:客户端已经连接上服务器,当服务器异常退出时,会导致客户端也异常退出。
分析原因如下:客户端连接上服务器后,服务器会给其分配一个单独的socket来与之通信。当服务器异常退出时,该socket也会被异常销毁。因此客户端在不知情的情况下会照常向服务器发送消息,一旦发送失败并且接收到SIGPIPE信号时,此信号的默认响应便是使进程退出,因此该客户端进程就异常退出了。
有时候需要要求进程不能异常退出时,即当进程接收到SIGPIPE信号时,得做出相应的处理而不是系统默认的异常退出,解决方法有很多,最有效的做法是拦截该信号并做出合适的处理,以下几种常用的做法可供参考:
1、直接忽略该信号
signal(SIGPIPE, SIG_IGN);
2、重载该信号的响应事件
void processSignal(int signo)
{
do somethings ...;
}
signal( SIGPIPE, processSignal) ;
将此拦截SIGPIPE信号的处理部分放在进程执行的起始位置,便可达到拦截的效果,而不会出现客户端自动退出的现象了。
阅读(2091) | 评论(0) | 转发(0) |