亲爱的,
我正在使用 C++ 编写网络服务器应用程序。
启动时,它会创建一个监听器套接字和用户定义数量的子进程( worker ),每个子进程(使用 kqueue、epoll 等)监视监听器以获取新的客户端连接,accept()
'ing 它们并创建一个线程来处理响应处理。一旦工作子进程响应了用户定义数量的客户端请求,它必须告诉父进程创建一个新的子进程,等待所有线程完成然后退出。
我的问题是:如果我的父进程中有一个创建子进程的函数 (create_child()
),我可以只从子进程中调用它并获得父进程的新子进程吗(期望的结果),或者它会创造一个 child 的 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);
}
.
.
}
child 和 parent 可以使用(惊喜!)read
和 write
系统调用,使用 fd
进行读写。 (如果通信应该是单向的,那么顺便说一下,一些 fd
应该被关闭。)
一旦您进行了通信,您就可以设计任何您希望子进程与父进程通信的协议(protocol),包括跨越其他进程。
关于c++ - 子进程如何告诉其父进程创建一个新的子进程?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35145868/