1.问题:在Client端send数据到Server端的时,收到来自Server端发来的Broken pipe信号,导致Client端异常退出!
2.原因分析:
# man 7 signal
Signal Value Action Comment
SIGPIPE 13 Term Broken pipe: write to pipe with no readers; see pipe(7)
3.解决方案:两种
<1>.方式一
如果隐式不调用SIGPIPE信号,会导致程序异常退出;如果显示调用,会忽略SIGPIPE信号,不会退出.
::send(in->fd, "start", strlen("start"), MSG_NOSIGNAL);
修改为:
signal(SIGPIPE, SIG_IGN);
::send(in->fd, "start", strlen("start"), MSG_NOSIGNAL);
<2>.方式二:write()异步方式设置
write(fd, "start_record", strlen("start_record"));
修改为:
int flag = fcntl(fd, F_GETFL, 0);
fcntl(fd, F_SETFL, flag | O_NONBLOCK);
signal(SIGPIPE, SIG_IGN);
write(fd, "start“, strlen("start"));