SIGPIPE,破裂的管道

SIGPIPE, Broken pipe

本文关键字:管道 SIGPIPE      更新时间:2023-10-16

我正在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信号处理为无操作,并以任何特定于应用程序的方式处理write调用周围的错误情况。这样的。