一个非常标准的C++ TCP服务器程序,使用pthreads进行绑定(bind),监听和接受。我有一种情况,当我杀死一个已连接的客户端时,服务器将结束(读取:崩溃)。

崩溃的原因是文件上的write()调用失败,因此程序收到SIGPIPE。而且我猜想,这会使服务器退出。

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

signal(SIGPIPE, SIG_IGN);

因为,取自man 2 write:



las,不。服务器线程和客户端线程都无济于事。

因此,如何防止write()调用发出该信号,或者(为了实用)如何阻止服务器退出。

我的诊断是:
  • 服务器线程已启动,绑定(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 ?? ()
    

    最佳答案

    您是否有机会在生成任何线程之前不忽略signal?如果您等到以后,其他线程之一仍然可以接收信号并退出您的应用程序。

    如果这样做没有效果,则在尝试执行写入操作以确保套接字可写之前,您始终可以执行poll/select写入操作。

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

    10-11 22:05
    查看更多