gpt4 book ai didi

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

转载 作者:可可西里 更新时间:2023-11-01 11:49:12 28 4
gpt4 key购买 nike

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

  • 主线程等待客户端请求 (epoll),接受它们并为每个客户端套接字生成一个分离线程
  • 每个线程分别执行SSL_acceptSSL 握手 成功后,线程从客户端接收消息,并为每个 SSL_read 返回一条消息。
  • 当客户端关闭套接字或发生任何错误时,客户端线程退出。

我尝试模拟并发客户端连接来测试服务器。

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

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

最初我尝试了 signal(SIGPIPE,SIG_IGN),但是 signal(2) man说:

The effects of signal() in a multithreaded process are unspecified.

可以signalfd用于处理此类 SIGPIPE?或者还有其他解决方案吗?

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

提前致谢。

最佳答案

Is there a way to catch and handle SIGPIPE at thread level? I want the respective thread to handle the signal instead of the entire process exiting.

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

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

反过来说:

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

关于c - 如何在多线程环境中处理 SIGPIPE?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23889062/

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