gpt4 book ai didi

concurrency - 如何保证来自多个子进程的信号传递

转载 作者:行者123 更新时间:2023-12-04 06:46:55 25 4
gpt4 key购买 nike

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

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

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

void sig_child_ready (int sig)
{
num_child_ready++;
}
num_child_ready声明为 volatile sig_atomic_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是否需要将信号“排队”以便一一处理?

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

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

最佳答案

正常信号不会排队,这很可能是您出现问题的原因。

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

您可以使用“实时信号”,它们确实会排队。你会用 sigqueue 发送信号() 和
sigwaitinfo“接收”它们() 或建立信号处理程序在 struct sigaction 中设置 SA_SIGINFO 标志

关于concurrency - 如何保证来自多个子进程的信号传递,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3631728/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com