一个非常标准的C++ TCP服务器程序,使用pthreads进行绑定(bind),监听和接受。我有一种情况,当我杀死一个已连接的客户端时,服务器将结束(读取:崩溃)。
崩溃的原因是文件上的write()
调用失败,因此程序收到SIGPIPE。而且我猜想,这会使服务器退出。
我以为“当然,未处理的信号意味着退出”,所以让我们使用signal()
:
signal(SIGPIPE, SIG_IGN);
因为,取自
man 2 write
:las,不。服务器线程和客户端线程都无济于事。
因此,如何防止
write()
调用发出该信号,或者(为了实用)如何阻止服务器退出。我的诊断是:
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 ?? ()
最佳答案
您是否有机会在生成任何线程之前不忽略signal
?如果您等到以后,其他线程之一仍然可以接收信号并退出您的应用程序。
如果这样做没有效果,则在尝试执行写入操作以确保套接字可写之前,您始终可以执行poll
/select
写入操作。
关于c++ - 如何防止SIGPIPE或防止服务器终止?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6821469/