使用工作线程模式时如何正确处理信号?

时间:2010-05-18 11:54:47

标签: c pthreads signals

我有一个看起来像这样的简单服务器:

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()调用返回并检查外部变量以查看它是否应该中断;?

2 个答案:

答案 0 :(得分:2)

通常我等select(listeninig-socket-here)而不是accept()accept()通常是一种程序不会花费大量时间等待的方法。当我在select()等待并且信号SIGTERM被发送到该线程时(在你的情况下它是主线程)我退出select并且select返回interrupted system call

答案 1 :(得分:1)

我认为你第二次 skwllsp 你应该使用select call而不是accept。但是,我的另一个建议是,你遵循博客的建议,你已发布的链接,并创建一个单独的信号处理线程,并忽略所有其他线程中的信号。然后,当在信号处理线程中接收到信号时,使用pthread_cancel取消其他线程。当你使用pthread_cancel时,如果被取消的线程处于取消点(选择恰好是一个),它将出现并进入你的处理程序,你可以清理并退出该线程。

您可以在hereherehere

上找到更多相关信息。