[英]SIGPIPE, Broken pipe
我正在研究在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 ?? ()
我的服務器做了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;
}
當您寫入已關閉的管道(由遠程端)時,您的程序將收到此信號。 對於簡單的命令行過濾器程序,這通常是適當的默認操作,因為SIGPIPE的默認處理程序將終止程序。
對於多線程程序,正確的操作通常是忽略 SIGPIPE信號,因此寫入已關閉的套接字不會終止程序。
請注意,在寫入之前無法成功執行檢查,因為遠程端可能會在檢查和write()
調用之間關閉套接字。
有關忽略SIGPIPE的更多信息,請參閱此問題: 如何防止SIGPIPE(或正確處理它們)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.