父和子使用信号进行同步

时间:2013-03-30 16:47:56

标签: c synchronization signals parent-child

我遇到了一些麻烦: 我不清楚如何使用信号同步父进程和子进程,并且此代码不起作用。 我认为它应该这样工作:父发送信号给孩子,孩子的pause()结束,孩子发信号给父母,父母的pause()结束..等等 为什么不是这样呢?

#include <stdlib.h>
#include <stdio.h>
#include <signal.h>
#include <sys/types.h>

void handler_cp() {
}

void handler_pc() {
}

void child_proc() {
    int i = 0;
    for (; i < 50; ++i) {
        pause();
        kill(getppid(), SIGUSR2);
    }

void parent_proc(pid_t ch) {
    int j = 0;
    for (; j < 50; ++j) {
        kill(ch, SIGUSR1);
        pause();
    }
}

int main(int argc, char* argv[]) {
    signal(SIGUSR1, handler_cp);
    signal(SIGUSR2, handler_pc);
    pid_t ch = fork();
    if (ch == 0)
        child_proc();
    else
        parent_proc(ch);
    return 0;
}

2 个答案:

答案 0 :(得分:2)

信号可能会在调用pause之前到达,在这种情况下它会死锁。通常,使用信号进行同步是一个非常糟糕的主意。

答案 1 :(得分:1)

在child_proc方法中,将行反转为:

          kill(getppid(),SIGUSR2);
          pause();

这将在孩子入睡前唤醒父母。