【发布时间】:2016-02-02 05:39:26
【问题描述】:
亲爱的,
我正在使用 C++ 编写网络服务器应用程序。
当启动时,它会创建一个监听器套接字和用户定义数量的子进程(工作者),每个子进程(使用 kqueue、epoll 等)监视监听器以获取新的客户端连接,accept()'ing 他们并创建处理响应处理的线程。一旦工作子进程响应了用户定义数量的客户端请求,它必须告诉父进程创建一个新的子进程,等待所有线程完成然后退出。
我的问题是:如果我的父进程中有一个创建子进程的函数 (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() 返回 0,则当您执行 create_child 函数时,您已经处于子进程中。该进程是调用 fork 的进程的子进程。原来的父进程没有特殊意义,并且不被fork跟踪。
-
父进程还会做什么?为什么不让父进程监视子进程的终止,并创建一个新的子进程来替换它?
-
@Donnie,我知道。我想要的是某种方式,从孩子内部(在 fork() == 0 之后)告诉父母创建一个新孩子。
-
你想要的叫做进程间通信。
-
您需要使用某种 IPC 来要求父代为您分叉。如果管道太重并且您不需要大量通信,则可以使用其他 IPC 机制(例如信号量)
标签: c++ c fork child-process