我有一个简单的服务器,看起来像这样:
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
返回中断的系统调用
。
关于c - 使用工作线程模式时如何正确处理信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2856944/