逗人,
我正在使用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系统来编写一个简单的程序并测试会发生什么,但在我的搜索中,我在某处读到它会创建一个子进程的子进程。那么,如何从另一个孩子中创建父母的孩子?
对不起,如果难以理解,写这个问题我有点困。在此先感谢您的帮助。
答案 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
,孩子和家长可以使用(惊奇!)write
和fd
系统调用进行读写。 (如果沟通应该是单向的,那么fd
的一些应该是偶然关闭的。)
一旦您进行了沟通,您就可以设计您希望孩子与父母沟通的任何协议,包括跨越其他流程。
答案 1 :(得分:1)
回答第一个问题:如果你从孩子那里分叉,那么孩子就有了孩子。您的初始父进程是最后一个进程的祖父进程。
更有趣的是,如果第一个孩子终止,而第二个孩子仍然在运行 - 这是你当前设计中会发生的事情 - 那么第二个孩子就会变成孤儿并被附加到init。不允许任何进程没有父进程。初始父进程无法监视刚刚被init采用的这个已经过去的大孩子。
回答第二个问题:你不能。
你应该监视父母内部的孩子。根据您目前的设计,如果孩子在告诉父母更换它之前死了怎么办?还是在它取代之前?
这可能是一个起点:
for(int i=0;i<10;++i)
create_process();
for(;;) {
int status;
wait( &status );
create_process();
}