C 如何在多线程环境中处理SIGPIPE?

C 如何在多线程环境中处理SIGPIPE?,c,linux,multithreading,signals,C,Linux,Multithreading,Signals,我有一个用C编写的多线程SSL服务器,其行为如下: 主线程等待客户端请求(epoll),接受它们并为每个客户端套接字生成一个分离的线程 每个线程不单独接受SSL。成功的SSL握手后,线程从客户端接收消息,并为每个SSL\u读取返回一条消息 当客户端关闭套接字或发生任何错误时,客户端线程退出 我尝试模拟并发客户端连接来测试服务器 在一次这样的模拟中,我的服务器以SIGPIPE信号退出 有没有一种方法可以在线程级别捕获和处理SIGPIPE?我希望各个线程处理信号,而不是整个进程退出 最初我尝试了

我有一个用C编写的多线程SSL服务器,其行为如下:

  • 主线程等待客户端请求(
    epoll
    ),接受它们并为每个客户端套接字生成一个分离的线程
  • 每个线程不单独接受SSL。成功的SSL握手后,线程从客户端接收消息,并为每个
    SSL\u读取
    返回一条消息
  • 当客户端关闭套接字或发生任何错误时,客户端线程退出
我尝试模拟并发客户端连接来测试服务器

在一次这样的模拟中,我的服务器以
SIGPIPE
信号退出

有没有一种方法可以在线程级别捕获和处理
SIGPIPE
?我希望各个线程处理信号,而不是整个进程退出

最初我尝试了
信号(信号管,信号灯)
,但说:

未指定信号()在多线程进程中的作用

可用于处理此类
sigpiples
? 还是有其他解决方案

注意:服务器在Ubuntu 12.04上运行,我不能在
send
上使用
MSG_NOSIGNAL
,因为我直接使用OpenSSL作为库(无源代码)

提前谢谢

有没有办法在线程级别捕获和处理SIGPIPE?我希望各个线程处理信号,而不是整个进程退出

是的,有。您需要在除一个线程之外的所有线程中阻止信号(最好在创建任何线程之前执行此操作)。如果您使用的是pthread,那么可以使用
pthread_sigmask
,因为这将保证在调用它之后,每个创建的线程都将继承信号掩码。然后在一个特定的线程中,您需要用
sigaction
注册一个处理程序(不要使用
signal
,它已经过时)

当信号到达您的进程时,它将被阻塞,直到这一个线程将继续它在进程上的工作为止(只有当该信号被进程接收时,这就是为什么它是未指定的行为-它取决于哪个线程正在运行,但通过阻塞所有其他线程上的信号,您可以指定哪个线程可以对其作出反应)

另一方面:


如果您想永远不接收此信号并知道哪个套接字被它破坏,则只能使用
pthread\u sigmask
并忽略所有线程的此信号。然后,由于SIGPIPE而中断的函数应该返回-1(我不熟悉openssl,但当谈到套接字时,它是
write
的说法,套接字在另一侧关闭了)。

可能重复No。这篇文章没有谈到多线程环境。我已经尝试了那篇文章中提到的选项。它可能是未指定的,但是如果你在创建线程之前这样做,你不会有问题。忽略信号很容易,所以呢?这仍然是正确的答案。我试着为每个新线程在SIGPIPE上签名。这对我没有帮助。在创建任何线程之前发送信号(SIGPIPE、SIG_IGN)是否有帮助?谢谢。如果我的解释是正确的,您是在建议我使用一个专用线程来处理所有其他线程上的信号和块信号吗?但我如何找到SIGPIPE被提升的线程?我需要正确关闭客户端套接字(导致SIGPIPE)并退出该特定线程。我对所有线程使用了
pthread\u sigmask
并忽略了
SIGPIPE
。到目前为止,我还没有看到任何异常出口。进行了一些测试。谢谢