与C中的信号进行进程间通信 - 为什么会失败?

时间:2011-10-31 11:33:48

标签: c process signals

我不确定我是不是想把一个方形钉挂在圆孔上,但是我正在尝试用信号来协调五到六个子进程和它们的父进程。我有父设置来处理这些信号

signal(1, SigControllerCarWaiting1);
signal(2, SigControllerCarWaiting2);
signal(3, SigControllerCarWaiting3);
signal(4, SigControllerCarWaiting4);
signal(5, SigControllerCarWaiting5);

signal(6, SigControllerCarEnter1);
signal(7, SigControllerCarEnter2);
signal(8, SigControllerCarEnter3);
signal(9, SigControllerCarEnter4);
signal(10, SigControllerCarEnter5);

它主要起作用。当我运行我的程序时,它会多次按预期完成。但有些时候,它将无法覆盖默认行为,我的父进程将输出类似'Hangup'的内容然后终止....让一群孩子仍在执行。

我尝试在处理程序中重新建立信号,如...

void SigControllerCarWaiting5() { signal(5, SigControllerCarWaiting5); SigControllerCarWaiting(4); }
void SigControllerCarWaiting4() { signal(4, SigControllerCarWaiting4); SigControllerCarWaiting(3); }
void SigControllerCarWaiting3() { signal(3, SigControllerCarWaiting3); SigControllerCarWaiting(2); }
void SigControllerCarWaiting2() { signal(2, SigControllerCarWaiting2); SigControllerCarWaiting(1); }
void SigControllerCarWaiting1() { signal(1, SigControllerCarWaiting1); SigControllerCarWaiting(0); }

但它似乎没有影响。有时它运行得很好;其他时候它将失败信号文本并杀死父母。我对这一切都很陌生,并认为有人可以指出我正确的方向。除了'信号(ID,功能)我应该使用什么来捕获多个输入信号?

如果我只使用一个子进程运行它,它似乎永远不会失败。所以我假设它与孩子之间的种族条件有关......但是我无法在跟踪它时取得任何进展。

修改

经过进一步调查,我发现网站建议使用sigaction而不是信号......但我似乎仍然遇到同样的问题。有时,信号不会由我处理,导致我的过程提前结束。

1 个答案:

答案 0 :(得分:1)

生活和学习......

使用信号;如果两个孩子同时发送相同的信号,第一个将由我的处理程序处理,但第二个将在处理程序重新建立自己作为处理程序之前执行,导致默认行为发生。

更改为 sigaction 会阻止此操作。但是,它仍然对某些信号“失败”(特别是9或SIGKILL,因为系统不允许您覆盖SIGKILL行为)。

所以,我的解决方案是使用sigaction 不使用SIGKILL进行我自己的自定义通信。

除此之外;看起来像其他人所说的那样,在这种情况下,管道或信号量将是更好的工具。