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

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

最佳答案

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

关于c - 使用工作线程模式时如何正确处理信号?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/2856944/

相关文章:

c++ - pthreads - 先前创建的线程使用新值(线程创建后更新)

c - 结构的大小怎么可能是 4 的非倍数?

c - 使用多个线程时,C 中的多线程编程速度较慢

c - 收到警报信号时,read() 系统调用不会失败

c - 什么是默认互斥锁属性?

c - 使用串行和多线程实现程序蒙特卡罗计算pi

我可以将 char* 与 sigqueue 发送到另一个进程吗

c++ - 进程被杀死时如何获取.gcda文件?

c++ - 获取 QT 代码的纯 C++ 实现

C 程序使用 GCC 在 Linux 上仅提供 UTC 时间作为本地时间