cod*_*ons 16 c c++ linux networking
我正在研究在linux机器上使用epoll的网络程序,我收到了来自gdb的错误消息.
Program received signal SIGPIPE, Broken pipe.
[Switching to Thread 0x7ffff609a700 (LWP 19788)]
0x00007ffff7bcdb2d in write () from /lib/libpthread.so.0
(gdb)
(gdb) backtrace
#0 0x00007ffff7bcdb2d in write () from /lib/libpthread.so.0
#1 0x0000000000416bc8 in WorkHandler::workLoop() ()
#2 0x0000000000416920 in WorkHandler::runWorkThread(void*) ()
#3 0x00007ffff7bc6971 in start_thread () from /lib/libpthread.so.0
#4 0x00007ffff718392d in clone () from /lib/libc.so.6
#5 0x0000000000000000 in ?? ()
Run Code Online (Sandbox Code Playgroud)
我的服务器做了n ^ 2次计算,我试图用500个连接用户运行服务器.什么可能导致此错误?我该如何解决这个问题?
while(1){
if(remainLength >= MAX_LENGTH)
currentSentLength = write(client->getFd(), sBuffer, MAX_LENGTH);
else
currentSentLength = write(client->getFd(), sBuffer, remainLength);
if(currentSentLength == -1){
log("WorkHandler::workLoop, connection has been lost \n");
break;
}
sBuffer += currentSentLength;
remainLength -= currentSentLength;
if(remainLength == 0)
break;
}
Run Code Online (Sandbox Code Playgroud)
Gre*_*ill 30
当您写入已关闭的管道(由远程端)时,您的程序将收到此信号.对于简单的命令行过滤器程序,这通常是适当的默认操作,因为SIGPIPE的默认处理程序将终止程序.
对于多线程程序,正确的操作通常是忽略 SIGPIPE信号,因此写入已关闭的套接字不会终止程序.
请注意,在写入之前无法成功执行检查,因为远程端可能会在您的支票和您的通话之间关闭套接字write().
有关忽略SIGPIPE的更多信息,请参阅此问题:如何防止SIGPIPE(或正确处理它们)