[英]How to properly handle signals when using the worker thread pattern?
我有一个简单的服务器,看起来像这样:
void *run_thread(void *arg) {
// Communicate via a blocking socket
}
int main() {
// Initialization happens here...
// Main event loop
while (1) {
new_client = accept(socket, ...);
pthread_create(&thread, NULL, &run_thread, *thread_data*);
pthread_detach(thread);
}
// Do cleanup stuff:
close(socket);
// Wait for existing threads to finish
exit(0);
)
因此,当收到SIGINT或SIGTERM时,我需要打破主事件循环以获得清理代码。 此外,主线程很可能正在等待accept()调用,因此它无法检查其他变量以查看它是否应该中断;
我发现的大多数建议都是这样的: http : //devcry.blogspot.com/2009/05/pthreads-and-unix-signals.html (创建一个特殊的信号处理线程来捕获所有信号并做处理那些)。 然而,这是我无法真正解决的处理部分:我怎么可能告诉主线程从accept()调用返回并检查外部变量以查看它是否应该中断;?
通常我在等待select(listeninig-socket-here)
而不是在accept()
。 accept()
通常是一种程序不会花费大量时间等待的方法。 当我在select()
等待并且信号SIGTERM被发送到该线程时(在你的情况下它是主线程)我退出该select
并select
返回interrupted system call
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.