子进程如何告诉其父进程创建新的子进程

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

本文关键字:子进程 创建 进程 何告诉      更新时间:2023-10-16

亲爱的,

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

启动时,它会创建一个侦听器套接字和用户定义数量的子进程(worker(,每个子进程监视侦听器(使用 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 s。 (如果通信应该是单向的,那么顺便说一下,应该关闭一些fd

一旦你有了沟通,你可以设计任何你想要的协议,让孩子与父母沟通,包括跨越其他进程。

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

更令人不安的是,如果第一个孩子终止了,而第二个孩子仍在运行——这就是你当前设计中会发生的情况——第二个孩子成为孤儿并依附于 init。任何进程都不允许没有父进程。初始父进程无法监视这个刚刚被 init 收养的被遗弃的孙子。

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

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

这可能是一个起点:

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