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
信号处理为无操作,并以任何特定于应用程序的方式处理write
调用周围的错误情况。这样的。
相关文章:
- 在进程中对同一管道进行读取和写入时C++管道出现问题
- IPC使用多个管道和分支进程来运行Python程序
- 如何创建函数管道,以便函数一个接一个地运行?
- Gstreamer 管道从命令 lne 到 c 代码
- 外壳包装器句柄/执行交互式命令管道C++ UNIX
- 将旧管道转换为现代 openGL 时出现问题
- 如何使用管道在父级和子级之间来回传递文件
- 在没有管理员权限的情况下连接到同一网络中的命名管道
- 如何测量管道延迟?
- 我如何使用此程序管道多个命令?C++
- 先进先出:一个进程永远不会从管道读取
- Node.js fs.open() 在尝试打开 4 个以上的命名管道 (FIFO) 后挂起
- 使用模板而不是虚拟方法的管道模式
- 我可以写入关闭的套接字并强制纠正损坏的管道错误吗?
- 在 Azure DevOps 构建管道中使用英特尔C++编译器为 Linux 环境构建C++代码
- Opencv GStreamer管道在Raspberry Pi 4上不起作用
- 接收到的信号:SIGPIPE(管道破裂)
- C++和OpenSSL:SIGPIPE在封闭管道中写入时
- SIGPIPE,破裂的管道
- OpenSSL SSL_shutdown收到信号SIGPIPE,管道破裂