异步c ++进程间控制

时间:2014-03-01 22:34:51

标签: c++ fork posix interprocess

我在Ubuntu 12.04 LTS上用c ++编写这个,我明确没有使用任何BOOST库。 我想要做的是拥有一个父进程,同时运行两个或多个子进程。

父进程的作用类似于事件侦听器和任务调度程序。孩子们处理父母告诉他们的任务;这些任务是系统调用,父母在完成时并不关心。

到目前为止我成功完成的是

  • 父将fork()一些孩子并保留他们的pid
  • 儿童在fork()暂停()
  • 后立即被暂停(S)
  • 父级恢复(R)并以标准事件循环方式检测事件

接下来我需要知道的是如何在孩子还在运行时恢复孩子并返回父母。

所以我的问题是,父母和孩子能够以这种方式同时安全地运行吗? (父母不在乎孩子恢复后的行为)

一般来说,我需要做什么才能在暂停()后恢复子进程?

下面的

是分配子项的构造函数

childManager(int number_of_children, pid_t parent) {
    int i=0;

    while(number_of_children--) {
        if(parent == getpid())
        {   
            this->parent = parent;
            children.push_back({++i,_IDLE,fork()});
            if(parent != getpid()) pause();
        }
    }
}

2 个答案:

答案 0 :(得分:1)

我在这里看到的唯一问题是

  

一般来说,我需要做什么才能在暂停()后恢复子进程?

发送一个信号,其动作是执行信号捕捉功能或终止该过程。例如:

kill(children[i], SIGUSR);

尽管如此,这是一种不太理想的方式。您可以很容易地让孩子在管道上阻塞,等待父母告诉他们做某事。或大约30个不涉及信号的类似事物。

答案 1 :(得分:0)

回答您的具体问题:

  

所以我的问题是,父母和孩子能够以这种方式同时安全地运行吗? (父母不在乎孩子恢复后的行为)

父进程必须在退出后调用waitwaitpid来收集子进程。如果你不这样做,你将留下僵尸进程。您可以在父进程的事件循环内以非阻塞方式执行此操作。

  

一般来说,我需要做什么才能在暂停()后恢复子进程?

您必须向子进程发送信号。您可以通过在父进程中调用kill来执行此操作。您需要在子进程中安装信号处理程序以捕获信号 - 使用sigaction