哪个线程处理信号?

2024-11-14 08:30:00
admin
原创
20
摘要:问题描述:我有 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)。

相关推荐
  为什么项目管理通常仍然耗时且低效?您是否还在反复更新电子表格、淹没在便利贴中并参加每周更新会议?这确实是耗费时间和精力。借助软件工具的帮助,您可以一目了然地全面了解您的项目。如今,国内外有足够多优秀的项目管理软件可以帮助您掌控每个项目。什么是项目管理软件?项目管理软件是广泛行业用于项目规划、资源分配和调度的软件。它使项...
项目管理软件   601  
  华为IPD与传统研发模式的8大差异在快速变化的商业环境中,产品研发模式的选择直接决定了企业的市场响应速度和竞争力。华为作为全球领先的通信技术解决方案供应商,其成功在很大程度上得益于对产品研发模式的持续创新。华为引入并深度定制的集成产品开发(IPD)体系,相较于传统的研发模式,展现出了显著的差异和优势。本文将详细探讨华为...
IPD流程是谁发明的   7  
  如何通过IPD流程缩短产品上市时间?在快速变化的市场环境中,产品上市时间成为企业竞争力的关键因素之一。集成产品开发(IPD, Integrated Product Development)作为一种先进的产品研发管理方法,通过其结构化的流程设计和跨部门协作机制,显著缩短了产品上市时间,提高了市场响应速度。本文将深入探讨如...
华为IPD流程   9  
  在项目管理领域,IPD(Integrated Product Development,集成产品开发)流程图是连接创意、设计与市场成功的桥梁。它不仅是一个视觉工具,更是一种战略思维方式的体现,帮助团队高效协同,确保产品按时、按质、按量推向市场。尽管IPD流程图可能初看之下显得错综复杂,但只需掌握几个关键点,你便能轻松驾驭...
IPD开发流程管理   8  
  在项目管理领域,集成产品开发(IPD)流程被视为提升产品上市速度、增强团队协作与创新能力的重要工具。然而,尽管IPD流程拥有诸多优势,其实施过程中仍可能遭遇多种挑战,导致项目失败。本文旨在深入探讨八个常见的IPD流程失败原因,并提出相应的解决方法,以帮助项目管理者规避风险,确保项目成功。缺乏明确的项目目标与战略对齐IP...
IPD流程图   8  
热门文章
项目管理软件有哪些?
云禅道AD
禅道项目管理软件

云端的项目管理软件

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

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

内置subversion和git源码管理

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

免费试用