Nat*_*raj 4 c linux multithreading signals
我有一个用C编写的多线程SSL服务器,其行为如下:
epoll),接受它们并为每个客户端套接字生成一个分离的线程SSL_accept分开执行.成功进行SSL握手后,线程会从客户端接收消息并回复每条消息SSL_read.我尝试模拟并发客户端连接来测试服务器.
在一次这样的模拟中,我的服务器退出了SIGPIPE信号.
有没有办法SIGPIPE在线程级别捕获和处理?我希望相应的线程处理信号而不是整个进程退出.
最初我尝试过signal(SIGPIPE,SIG_IGN),但是信号(2)男人说:
signal()在多线程进程中的影响未指定.
可以signalfd被用来处理这些SIGPIPEs?还是有其他解决方案吗?
注意:服务器在Ubuntu 12.04上运行,我不能使用MSG_NOSIGNAL,send因为我直接使用OpenSSL作为库(没有源代码)
提前致谢.
有没有办法在线程级别捕获和处理SIGPIPE?我希望相应的线程处理信号而不是整个进程退出.
就在这里.您需要阻止除一个线程之外的所有线程中的信号(在创建任何线程之前最好这样做).如果你正在使用pthreads,你可以使用,pthread_sigmask因为这将保证,在调用它后,每个创建的线程将继承信号掩码.然后在一个特定的线程中,你需要注册一个处理程序(不要使用signal它,它已经过时了)sigaction.
当信号到达你的进程时它将被阻塞,直到这一个线程将继续它的进程工作(只有那时信号被进程接收,这就是为什么它是未指定的行为 - 它取决于正在运行的线程,但是通过阻止所有其他线程上的信号你指定哪个线程可以对它作出反应).
其他方式:
如果你想永远不接收这个信号并且知道哪个套接字被它破坏了,你只能使用pthread_sigmask并忽略所有线程的这个信号.然后由于SIGPIPE而破坏的函数应该返回-1(我不熟悉openssl,但是当谈到套接字时,它的write说法是,套接字在另一边关闭).