子进程如何告诉其父进程创建一个新子进程?

时间:2016-02-02 05:39:27

标签: c++ c fork child-process

逗人,

我正在使用C ++编写网络服务器应用程序。

启动时,它会创建一个侦听器套接字和一个用户定义数量的子进程(worker),每个进程监视侦听器(使用kqueue,epoll等)以获取新的客户端连接,accept()使用它们并创建一个线程来处理响应处理。一旦worker子进程回答用户定义数量的客户端请求,它必须告诉父进程创建一个新的子进程,等待所有线程完成然后退出。

我的问题是:如果我的父母中有一个创建子进程的函数(create_child()),我可以从子进程中调用它并获得父进程的新子进程(所需结果),还是会创造一个孩子的孩子?防爆。 (伪代码):

void create_child() {
    //create child process
}

int main()
{
    //do things

    if(fork() == 0) {
        //do things

        create_child(); //is result a child of parent or child of child?
    }
}

我更喜欢不使用烟斗,我想避免它的开销,但请告诉我它是否是唯一的解决方案。我目前没有Linux系统来编写一个简单的程序并测试会发生什么,但在我的搜索中,我在某处读到它会创建一个子进程的子进程。那么,如何从另一个孩子中创建父母的孩子

对不起,如果难以理解,写这个问题我有点困。在此先感谢您的帮助。

2 个答案:

答案 0 :(得分:1)

通常,当您执行fork时,并希望在父母与父母之间进行沟通。子进程(或一般在进程之间,可以考虑它),您可以使用pipe

    #include <stdio.h>
    #include <unistd.h>
    #include <sys/types.h>

    main()
    {
            int     fd[2];
            pid_t   childpid;

            pipe(fd);

            if((childpid = fork()) == -1)
            {
                    perror("fork");
                    exit(1);
            }
            .
            .
    }

使用read,孩子和家长可以使用(惊奇!)writefd系统调用进行读写。 (如果沟通应该是单向的,那么fd的一些应该是偶然关闭的。)

一旦您进行了沟通,您就可以设计您希望孩子与父母沟通的任何协议,包括跨越其他流程。

答案 1 :(得分:1)

回答第一个问题:如果你从孩子那里分叉,那么孩子就有了孩子。您的初始父进程是最后一个进程的祖父进程。

更有趣的是,如果第一个孩子终止,而第二个孩子仍然在运行 - 这是你当前设计中会发生的事情 - 那么第二个孩子就会变成孤儿并被附加到init。不允许任何进程没有父进程。初始父进程无法监视刚刚被init采用的这个已经过去的大孩子。

回答第二个问题:你不能。

你应该监视父母内部的孩子。根据您目前的设计,如果孩子在告诉父母更换它之前死了怎么办?还是在它取代之前?

这可能是一个起点:

for(int i=0;i<10;++i)
  create_process();
for(;;) {
  int status;
  wait( &status );
  create_process();
}