【问题标题】:How to know the signal delivered to thread如何知道传递给线程的信号
【发布时间】:2014-01-14 14:12:14
【问题描述】:

我有一个运行 2.6.33 的基于 ARM 的嵌入式系统。 一个主进程-A 创建另一个进程-B。两者都是具有实时 RR 策略的应用程序。这个 proc-B 使用 pthread_create() 创建了几个线程。我猜其中一个线程做错了,进程被杀死了。

在进程 A 中使用 wait() 时,我得到状态 1 返回(正常),如下所示。

我想知道如何获取哪个信号已经传递到里面的哪个线程 进程-B。

waitpid(-1, &status, WUNTRACED | WCONTINUED)
  and 
  if (WIFEXITED(status))
    printf("Process %d terminated normally, status %d\n", pid,WEXITSTATUS(status));

关注链接但获得与 1 相同的状态。 http://www.cs.cf.ac.uk/Dave/C/node32.html#SECTION003240000000000000000

有没有其他方法可以找出所有线程的正确退出状态,如果有任何发送到这些线程的信号?

【问题讨论】:

    标签: multithreading linux-kernel signals multiprocessing


    【解决方案1】:

    好的,首先,您应该知道多线程和信令不能很好地混合!这在很大程度上是由于信号被传递到 PID 的事实。一个 MT 应用程序有 1 个 PID,但有多个线程;哪个线程将“获取”/处理信号?

    因此,“通常”策略是阻塞除一个线程之外的所有线程中的所有信号 - 专用同步“信号处理程序”线程(它通常发出阻塞 sigwait(2);返回值是刚刚到达的信号!)。 Here's a (simplistic) app 演示混合线程和信号。

    其次,要了解有关进程如何/为什么死亡的一些细节 - 从技术上讲,接收到一个信号 - 使用带有 SA_SIGINFO 标志的 sigaction(2)。现在的信号处理程序签名是:

    void func(int signo, siginfo_t *info, void *context)
    

    struct siginfo_t 将为您提供有关此进程如何/为何接收此信号的所有详细信息!参考:sigaction(2) man page。 当然,使用这种方法确实意味着您使用 sigaction 而不是 sigwait.. 异步与同步处理。 HTH。

    【讨论】:

      最近更新 更多