簡體   English   中英

SIGPIPE,破管

[英]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(或正確處理它們)

您沒有捕獲SIGPIPE信號,但您正在嘗試寫入已被破壞/關閉的管道。

相當不言自明。

通常只需將SIGPIPE信號作為無操作處理,並以您需要的任何特定於應用程序的方式處理write調用的錯誤情況......就像這樣

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM