如何知道传递给线程的信号

时间:2014-01-14 14:12:14

标签: multithreading linux-kernel signals multiprocessing

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

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

我想知道如何将哪个信号传递到哪个线程 过程-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

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

1 个答案:

答案 0 :(得分: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 .. async vs sync handling。 HTH。