将Child-Parent与信号和暂停同步

时间:2017-03-19 23:11:24

标签: c signals wait kill pause

我正在玩一些c代码,尝试让一系列子进程执行一些异步工作,然后进行一些同步工作。

父母负责组织孩子的同步性。

以下是代码中的一般概念:

#define CHILDREN 5

void myHandle(int d) {}

int main () {
    int i;
    int pid[CHILDREN];
    signal(SIGUSR1, myHandle);
    for(i = 0 ; i < CHILDREN ; i++ ){
        pid[i] = fork();
        if (pid[i] == 0 ){

            // DO SOME ASYNCHRONOUS WORK

            // tell my parent I am done:
            kill(getppid(), SIGUSR1); 

            // wait for parent to wake me up.
            pause();

            // DO SOME SYNCHRONOUS WORK

            //wake parent back up.
            kill(getppid() , SIGUSR1);

            exit(1);
        }
    }

    // Wait for all children to finish async work:
    for (i = 0 ; i < CHILDREN ; i++) {
        pause(); // ISSUE IS HERE
    }

    // wake children back up in order:
    for (i = 0 ; i < CHILDREN ; i++ ) {
        kill(pid[i], SIGUSR1);
        // wait for child to finish work.
        pause();
    }

    return 0;
}

此代码实际上有效(大部分时间)。问题是父进程在for循环中暂停。在某些情况下,多个孩子同时完成他们的异步工作,导致许多对父母的杀戮。循环不能足够快地迭代以使父进程对所有kill调用都处于暂停状态,导致程序卡在没有接收到信号的暂停上。

任何帮助或建议都会很棒 - 谢谢大家!

1 个答案:

答案 0 :(得分:1)

一个可能的解决方案是在主函数中有一个大小为CHILDREN的数组。当孩子完成后,在他的数组元素中加上一个值。然后父亲必须检查数组中的所有标志是否都已启动。

这样,孩子之间就不会有写冲突,因为他们每个人都有自己的区域