【发布时间】:2014-05-27 12:08:36
【问题描述】:
我有一个用 C 编写的多线程 SSL 服务器,其行为如下:
- 主线程等待客户端请求 (
epoll),接受它们并为每个客户端套接字生成一个分离的线程 - 每个线程单独执行
SSL_accept。 SSL 握手 成功后,线程会接收来自客户端的消息,并为每个SSL_read回复一条消息。 - 当客户端关闭套接字或发生任何错误时,客户端线程退出。
我尝试模拟并发客户端连接来测试服务器。
在一次这样的模拟中,我的服务器以SIGPIPE 信号退出。
有没有办法在线程级别捕获和处理SIGPIPE?我希望各个线程处理信号,而不是整个进程退出。
最初我尝试signal(SIGPIPE,SIG_IGN),但signal(2) man 说:
未指定多线程进程中 signal() 的效果。
signalfd可以用来处理这样的SIGPIPEs吗?
还是有其他解决方案?
注意:服务器在 Ubuntu 12.04 上运行,我不能在 send 上使用 MSG_NOSIGNAL,因为我直接使用 OpenSSL 作为库(无源代码)
提前致谢。
【问题讨论】:
-
没有。那篇文章没有谈到多线程环境。我已经尝试过该帖子中提到的选项。
-
它可能是未指定的,但如果你在创建线程之前这样做,你不会有问题。忽略信号很容易。
-
所以?这仍然是正确的答案。
-
我在 SIGPIPE 上为每个新线程尝试了 SIG_IGN。它没有帮助我。在创建任何线程之前执行 signal(SIGPIPE,SIG_IGN) 有帮助吗?
标签: c linux multithreading signals