[英]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);
}
.
.
}
孩子和家长可以读取和使用写(惊喜!) read
和write
使用系统调用, 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.