哪个线程处理信号?

2024-11-14 08:30:00
admin
原创
167
摘要:问题描述:我有 2 个线程(线程 1 和线程 2)。并且我有 的信号处理SIGINT。每当SIGINT发生时,线程 2 都应该处理信号。为此,我编写了以下程序#include <pthread.h> #include <signal.h> #include <stdio.h>...

问题描述:

我有 2 个线程(线程 1 和线程 2)。并且我有 的信号处理SIGINT。每当SIGINT发生时,线程 2 都应该处理信号。为此,我编写了以下程序

#include <pthread.h>
#include <signal.h>
#include <stdio.h>

void sig_hand(int no)                  //signal handler
{
    printf("handler executing...
");
    getchar();
}

void* thread1(void *arg1)              //thread1
{
    while(1) {
        printf("thread1 active
");
        sleep(1);
    }
}

void * thread2(void * arg2)           //thread2
{
    signal(2, sig_hand);

    while(1) {
        printf("thread2 active
");
        sleep(3);
    }
}

int main()
{
    pthread_t t1;
    pthread_t t2;

    pthread_create(&t1, NULL, thread1, NULL);
    pthread_create(&t2, NULL, thread2, NULL);
    while(1);
}

我编译并运行该程序。每 1 秒打印一次“thread1 active”,每 3 秒打印一次“thread2 active”。

现在我生成了SIGINT。但它打印“thread1 active”和“thread2 active”消息,如上所示。我再次生成SIGINT,现在每 3 秒只打印“thread2 active”消息。我再次生成SIGINT,现在所有线程都被阻止了。

所以我理解了,第一次主线程执行信号处理程序。第二次线程 1 执行处理程序,最后线程 2 执行信号处理程序。

我怎样才能编写代码,就像每当信号发生时,只有线程 2 必须执行我的信号处理程序?


解决方案 1:

如果向某个进程发送一个信号,那么该进程中的哪个线程将处理该信号是不确定的。

根据pthread(7)

POSIX.1 还要求线程共享一系列其他属性(即,这些属性是整个进程的而不是每个线程的):

......

  • 信号处置

......

POSIX.1 区分了指向整个进程的信号和指向单个线程的信号的概念。根据 POSIX.1,指向进程的信号(kill(2)例如,使用 发送)应由进程内任意选择的单个线程处理。


如果您希望进程中有一个专用线程来处理某些信号,这里有一个示例向pthread_sigmask(3)您展示如何操作:

下面的程序在主线程中阻止一些信号,然后创建一个专用线程通过 sigwait(3) 获取这些信号。以下 shell 会话演示了它的用法:

$ ./a.out &
[1] 5423
$ kill -QUIT %1
Signal handling thread got signal 3
$ kill -USR1 %1
Signal handling thread got signal 10
$ kill -TERM %1
[1]+  Terminated              ./a.out

程序源

#include <pthread.h>
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <signal.h>
#include <errno.h>

/* Simple error handling functions */

#define handle_error_en(en, msg) \n        do { errno = en; perror(msg); exit(EXIT_FAILURE); } while (0)

static void *
sig_thread(void *arg)
{
    sigset_t *set = arg;
    int s, sig;

   for (;;) {
        s = sigwait(set, &sig);
        if (s != 0)
            handle_error_en(s, "sigwait");
        printf("Signal handling thread got signal %d
", sig);
    }
}

int
main(int argc, char *argv[])
{
    pthread_t thread;
    sigset_t set;
    int s;

   /* Block SIGQUIT and SIGUSR1; other threads created by main()
       will inherit a copy of the signal mask. */

   sigemptyset(&set);
    sigaddset(&set, SIGQUIT);
    sigaddset(&set, SIGUSR1);
    s = pthread_sigmask(SIG_BLOCK, &set, NULL);
    if (s != 0)
        handle_error_en(s, "pthread_sigmask");

   s = pthread_create(&thread, NULL, &sig_thread, (void *) &set);
    if (s != 0)
        handle_error_en(s, "pthread_create");

   /* Main thread carries on to create other threads and/or do
       other work */

   pause();            /* Dummy pause so we can test program */
}

解决方案 2:

仔细阅读signal(7) & pthread(7) & pthread_kill(3) & sigprocmask(2) & pthread_sigmask(3) - 您可以使用它们(阻止SIGINT不需要的线程)。另请阅读pthread 教程。

避免使用信号在线程间进行通信或同步。例如,考虑互斥体(pthread_mutex_lock等...)和条件变量(pthread_cond_wait等...)。

如果其中一个线程运行事件循环(例如围绕poll(2) ...)请考虑使用signalfd(2)。

相关推荐
  政府信创国产化的10大政策解读一、信创国产化的背景与意义信创国产化,即信息技术应用创新国产化,是当前中国信息技术领域的一个重要发展方向。其核心在于通过自主研发和创新,实现信息技术应用的自主可控,减少对外部技术的依赖,并规避潜在的技术制裁和风险。随着全球信息技术竞争的加剧,以及某些国家对中国在科技领域的打压,信创国产化显...
工程项目管理   1565  
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   1354  
  信创国产芯片作为信息技术创新的核心领域,对于推动国家自主可控生态建设具有至关重要的意义。在全球科技竞争日益激烈的背景下,实现信息技术的自主可控,摆脱对国外技术的依赖,已成为保障国家信息安全和产业可持续发展的关键。国产芯片作为信创产业的基石,其发展水平直接影响着整个信创生态的构建与完善。通过不断提升国产芯片的技术实力、产...
国产信创系统   21  
  信创生态建设旨在实现信息技术领域的自主创新和安全可控,涵盖了从硬件到软件的全产业链。随着数字化转型的加速,信创生态建设的重要性日益凸显,它不仅关乎国家的信息安全,更是推动产业升级和经济高质量发展的关键力量。然而,在推进信创生态建设的过程中,面临着诸多复杂且严峻的挑战,需要深入剖析并寻找切实可行的解决方案。技术创新难题技...
信创操作系统   27  
  信创产业作为国家信息技术创新发展的重要领域,对于保障国家信息安全、推动产业升级具有关键意义。而国产芯片作为信创产业的核心基石,其研发进展备受关注。在信创国产芯片的研发征程中,面临着诸多复杂且艰巨的难点,这些难点犹如一道道关卡,阻碍着国产芯片的快速发展。然而,科研人员和相关企业并未退缩,积极探索并提出了一系列切实可行的解...
国产化替代产品目录   28  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

尊享禅道项目软件收费版功能

无需维护,随时随地协同办公

内置subversion和git源码管理

每天备份,随时转为私有部署

免费试用