【发布时间】:2011-12-18 16:22:30
【问题描述】:
我不确定我是否要尝试将方形钉插入圆孔,但我正在尝试使用信号来协调五个或六个子进程与其父进程。我有父设置来处理这些信号
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);
而且它大部分都有效。当我运行我的程序时,它会按预期完成很多次。但有时,它会无法覆盖默认行为,我的父进程会输出类似“挂断”的内容,然后终止....留下一堆子进程仍在执行。
我尝试在处理程序中重新建立信号,例如...
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); }
但它似乎没有影响。有时它运行得很好;其他时候它会因信号文本而失败并杀死父级。我对这一切都很陌生,并认为有人可以指出我正确的方向。除了 'signal(ID, Function) 我应该用什么来捕获多个传入信号吗?
如果我只用一个子进程运行它,它似乎永远不会失败。所以我假设它与孩子之间的某种种族状况有关......但我无法在追踪它方面取得任何进展。
编辑
经过进一步调查,我发现网站建议使用 sigaction 而不是信号...但我似乎仍然有同样的问题。有时,信号没有被我处理,并导致我的进程过早结束。
【问题讨论】:
-
为什么不使用管道、信号量或类似的东西?
-
总是检查系统调用的返回值;这样做会告诉你信号 9 (SIGKILL) 没有改变。