gpt4 book ai didi

c++ - 如何防止 SIGPIPE 或防止服务器结束?

转载 作者:IT老高 更新时间:2023-10-28 22:00:47 27 4
gpt4 key购买 nike

一个非常标准的 C++ TCP 服务器程序,使用 pthreadsbindlistenaccept。当我杀死一个连接的客户端时,我遇到了 服务器结束(阅读:崩溃)的场景。

崩溃的原因是 file 上的 write() 调用失败,因此程序收到了 SIGPIPE。我猜,这会让服务器退出。

我想,“当然,未处理的信号意味着退出”,所以让我们使用 signal():

signal(SIGPIPE, SIG_IGN);

因为,取自man 2 write:

EPIPE fd is connected to a pipe or socket whose reading end is closed. When this happens the writing process will also receive a SIGPIPE signal. (Thus, the write return value is seen only if the program catches, blocks or ignores this signal.)

唉,不。在服务器线程和客户端线程中,这似乎都没有帮助。

那么,如何防止 write() 调用 发出该信号,或者(务实地)如何阻止服务器退出。 p>


我的诊断结果是:

  • 服务器线程已启动、绑定(bind)、监听、接受。
  • 让客户端连接(例如通过 telnet)
  • 发送 pkill telnet 使客户端崩溃

不需要的行为:服务器退出,在 gdb 中带有

... in write () at ../sysdeps/unix/syscall-template.S:82
82 T_PSEUDO (SYSCALL_SYMBOL, SYSCALL_NAME, SYSCALL_NARGS)

回溯:

#0  ... in write () at ../sysdeps/unix/syscall-template.S:82
#1 ... in ClientHandler::mesg(std::string) ()
#2 ... in ClientHandler::handle() ()
#3 ... in start_thread (arg=<value optimized out>) at pthread_create.c:300
#4 ... in clone () at ../sysdeps/unix/sysv/linux/x86_64/clone.S:112
#5 ... in ?? ()

最佳答案

聚会迟到了,但只是想补充一下以供将来引用:如果您在 gdb 中调试代码,请不要忘记它会覆盖您的信号处理程序。

因此,如果您设置了信号处理程序,例如:signal(SIGPIPE, SIG_IGN),但它似乎不起作用,请尝试在调试器之外运行代码。

或设置 handle SIGPIPE nostop(在 gdb 提示符中)以防止 gdb 在信号上停止。

关于c++ - 如何防止 SIGPIPE 或防止服务器结束?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6821469/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com