繁体   English   中英

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

[英]How can child process tell its parent to create a new child?

亲爱,

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

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

我的问题是:如果我的父级中有一个创建子进程的函数( 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系统可以编写一个简单的程序并测试会发生什么,但是在搜索中,我读到某个地方它将创建子进程的子进程。 那么, 如何从另一个孩子中创建一个孩子的父母

很抱歉,如果变得难以理解,在写这个问题时我有点困。 在此先感谢您的帮助。

通常,当您进行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);
            }
            .
            .
    }

孩子和家长可以读取和使用写(惊喜!) readwrite使用系统调用, fd秒。 (如果通信应该是一种方式,那么顺便关闭一些fd 。)

进行通信后,您可以设计您希望孩子与父母进行通信的任何协议,包括跨越其他进程。

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

更有趣的是,如果第一个孩子终止,而第二个孩子仍在运行(这在您当前的设计中会发生这种情况),那么第二个孩子将成为孤儿,并附加到init上。 不允许进程没有父进程。 最初的父进程无法监视该init刚刚采用的弃子。

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

您可能应该从父母内部监视孩子。 在您当前的设计中,如果孩子在去世前告诉父母替换它,该怎么办? 还是在它取代自己之前?

这可能是一个起点:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM