SIGPIPE,破碎的pipe道

我正在使用Linux机器上的epoll的networking程序,我从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 ?? () 

我的服务器做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; } 

Solutions Collecting From Web of "SIGPIPE,破碎的pipe道"

当您写入已关闭的管道(通过远端)时,程序将收到此信号。 对于简单的命令行筛选器程序,这通常是一个适当的默认操作,因为SIGPIPE的默认处理程序将终止程序。

对于多线程程序,正确的操作通常是忽略 SIGPIPE信号,所以写入一个封闭的套接字不会终止程序。

请注意,在写入之前,您无法成功执行检查,因为远程端可能会在您的支票和您write()呼叫之间关闭套接字。

有关忽略SIGPIPE的更多信息,请参阅此问题: 如何防止SIGPIPE(或正确处理它们)

您不捕获SIGPIPE信号,但是您正在尝试写入已损坏/关闭的管道。

相当不言自明。

SIGPIPE信号作为无操作来处理通常就足够了,并且可以根据需要以任何应用程序特定的方式处理write调用的错误情况。