我有一个看起来像这样的简单服务器:
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()调用返回并检查外部变量以查看它是否应该中断;?
答案 0 :(得分:2)
通常我等select(listeninig-socket-here)
而不是accept()
。 accept()
通常是一种程序不会花费大量时间等待的方法。当我在select()
等待并且信号SIGTERM被发送到该线程时(在你的情况下它是主线程)我退出select
并且select
返回interrupted system call
。
答案 1 :(得分:1)