子进程如何告诉其父进程创建新的子进程
How can child process tell its parent to create a new child?
亲爱的,
我正在使用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);
}
.
.
}
孩子和父母可以使用(惊喜! read
和write
系统调用,使用 fd
s。 (如果通信应该是单向的,那么顺便说一下,应该关闭一些fd
。
一旦你有了沟通,你可以设计任何你想要的协议,让孩子与父母沟通,包括跨越其他进程。
回答第一个问题:如果你从一个孩子那里分叉,那么孩子就有了一个孩子。您的初始父进程是最后一个进程的祖父进程。
更令人不安的是,如果第一个孩子终止了,而第二个孩子仍在运行——这就是你当前设计中会发生的情况——第二个孩子成为孤儿并依附于 init。任何进程都不允许没有父进程。初始父进程无法监视这个刚刚被 init 收养的被遗弃的孙子。
回答第二个问题:你不能。
您可能应该从父母内部监视孩子。按照你现在的设计,如果孩子在告诉父母更换它之前就去世了怎么办?还是在它取代自己之前?
这可能是一个起点:
for(int i=0;i<10;++i)
create_process();
for(;;) {
int status;
wait( &status );
create_process();
}
- WMI检测进程创建事件-c++
- 终止 QProcess 不会终止子进程
- 什么时候最好在子进程中使用 CPU 或 I/O 密集型代码 [ C++ ]
- 子进程更新共享 mmap 内存,但父进程没有更改
- 从根权限进程创建可访问的文件
- 使用 waitpid 时等待子进程终止
- 使用重定向标准处理子进程中的 kbhit
- 由 JOB 中的进程启动的子进程是否可以将 JOB 属性设置为脱离作业?
- 是否可以将子进程的 stdout 重定向到父进程中的另一个文件?
- kill() 总是返回 0(成功),即使在子进程已经结束之后?
- 使用system()创建独立的子进程
- 使用 Node.js 调用child_process与从 C 调用子进程并创建C++绑定以从 node.js 调用
- 使用 fork 创建子进程时,父 ID 与父 ID 不同
- 创建子进程
- 子进程如何告诉其父进程创建新的子进程
- 如何在Linux下创建和监控子进程
- 使用CREATE_NEW_PROCESS_GROUP创建主机时,向子进程发送Ctrl+C
- c++ WIN API:当使用CreateProcess创建子进程时,我需要使输入参数具有全局生存期吗?
- Windows父进程和子进程创建
- 如何将应用程序作为新创建的资源管理器进程的子进程启动