【问题标题】:Interprocess Communication With Signals in C - Why Does It Fail?C 中与信号的进程间通信 - 为什么会失败?
【发布时间】: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 而不是信号...但我似乎仍然有同样的问题。有时,信号没有被我处理,并导致我的进程过早结束。

【问题讨论】:

标签: c process signals


【解决方案1】:

生活和学习...

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

更改为 sigaction 确实可以防止这种情况发生。但是,它仍然在某些信号上“失败”(特别是 9 或 SIGKILL,因为系统不允许您覆盖 SIGKILL 行为)。

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

除此之外;正如其他人所建议的那样,管道或信号量似乎是在这种情况下使用的更好工具。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多