Concurrency 如何保证多个子系统的信号传输

Concurrency 如何保证多个子系统的信号传输,concurrency,synchronization,ipc,signals,parent-child,Concurrency,Synchronization,Ipc,Signals,Parent Child,作为Linux基准测试应用程序的一部分,我有一个父进程,它派生多个子进程,每个子进程将并行执行一项任务。我用信号来协调它们,因为我在寻找尽可能精确的时间。每个孩子都将为测试做准备,然后通过信号进入父母控制的“屏障” 一旦所有子进程都进入屏障,父进程将记录时间戳,并向子进程发出开始的信号。一旦孩子完成了测试的每一部分,他们就会在进入下一个障碍之前向家长发出信号。父进程正在侦听这些信号,一旦从所有子进程接收到这些信号,它将记录完成时间 我的问题是程序非确定性终止;信号并不总是被传递。信号处理程序再简

作为Linux基准测试应用程序的一部分,我有一个父进程,它派生多个子进程,每个子进程将并行执行一项任务。我用信号来协调它们,因为我在寻找尽可能精确的时间。每个孩子都将为测试做准备,然后通过信号进入父母控制的“屏障”

一旦所有子进程都进入屏障,父进程将记录时间戳,并向子进程发出开始的信号。一旦孩子完成了测试的每一部分,他们就会在进入下一个障碍之前向家长发出信号。父进程正在侦听这些信号,一旦从所有子进程接收到这些信号,它将记录完成时间

我的问题是程序非确定性终止;信号并不总是被传递。信号处理程序再简单不过了:

void sig_child_ready (int sig)
{
    num_child_ready++;
}
num\u child\u ready
被声明为
volatile sig\u atomic\u t
。我尝试过在如下循环中使用sigprocmask,但没有成功:

sigprocmask (SIG_BLOCK, &mask, &oldmask);
while (num_child_ready < num_child)
{
    /* waiting for child signals here */
    sigsuspend (&oldmask);
}
sigprocmask (SIG_UNBLOCK, &mask, NULL);
sigprocmask(SIG_块、掩码和旧掩码);
while(num\u child\u ready
我不知道如何从这里开始。我是否正确认为需要使用
sigprocmask
对信号进行“排队”,以便逐个处理

或者,假设这个假设场景:父进程接收一个信号,正在执行它的处理程序,然后接收另一个相同的信号。信号处理程序是递归调用的吗?ie是否会在返回并完成第一个处理程序之前执行第二个处理程序


我只是想确保所有信号尽可能同步传输。

正常信号不排队,这可能是问题的原因

如果一个信号在处理程序为过去的信号运行之前到达,它们将被合并,您对此无能为力-您最好使用其他形式的IPC来进行这种同步

您可以使用“实时信号”,它确实会排队。你可以用()和()发送信号
使用()来“接收”它们,或者在
结构sigaction

中设置SA_SIGINFO标志来建立一个信号处理程序,最终使其工作。。。使用sigqueue()发送到多个子项时出现另一个问题。我假设我可以使用它发送给所有的孩子,就像使用kill:kill(0,SIGUSR1)一样。似乎这不能用sigqueue()完成!这一页非常有用: