流程A fork()流程B.
过程A死亡,因此init采用B.
监督者创建进程C.
C在某种程度上可以采用B init吗?
更新:
或者甚至可以让C直接采用B(当A死亡时),如果C是在A死之前创建的,而不是init成为B的中间父级?
更新1:
我也很感激任何关于为什么有可能以我所描述的方式采用一个过程可能是一件坏事或难以实现的评论.
Update-2 - 用例(父级和子级引用进程):
我有一个应用程序使用父级来管理一大堆子,这依赖于父级的管理工具.为了完成其工作,父母依靠通过孩子的终止通知,这通过接收相关SIGCHLD信号来完成.
如果父母本身因某些意外(包括segfaulting)而死亡,我需要重新启动整个"家庭",因为现在不可能在孩子终止时触发某些事情(这也可能是由于段错误).
在这种情况下,我需要关闭所有孩子并完成一个完整系统的重启.
避免这种情况的一种可能的方法是,有一个备用过程,可以接管死去的父母的角色...... - 如果它可以再次接收步骤儿童的SIGCHLD信号!
新父母总是"初始化"还是有某种方法来控制谁成为新的父母?
维基百科似乎表明它总是"初始化".我真的希望事实并非如此.我尝试过setpgid和setsid所能想到的一切,但没有运气.现在,我看到这篇维基百科文章,我需要建议.
在类Unix操作系统中,任何孤立的进程都将立即被特殊的init系统进程采用.此操作称为重新父级并自动发生.尽管从技术上讲,该进程将"init"进程作为其父进程,但它仍称为孤立进程,因为最初创建它的进程不再存在. 取自维基百科
我问的原因是因为我正在制作一个运行许多工作流程的Mac应用程序.我希望这些工作进程在任务管理器的进程层次结构中显示为主进程的子进程.一些工作者作为不同的用户运行,并且在Mac OS XI上需要分叉两次以将权限传递给子进程.因为我"双叉"工作人员目前作为守护人员运行,当与任务管理员一起查看时,我看到工作人员正在将"init"作为他们的父进程.
我试图pid在运行fork()命令后打印进程.这是我的代码 -
#include <stdio.h>
#include <unistd.h>
int main(void)
{
int pid;
pid=fork();
if(pid==0)
printf("I am the child.My pid is %d .My parents pid is %d \n",getpid(),getppid());
else
printf("I am the parent.My pid is %d. My childs pid is %d \n",getpid(),pid);
return 0;
}
Run Code Online (Sandbox Code Playgroud)
这是我得到的答案 -
I am the parent.My pid is 2420. My childs pid is 3601
I am the child.My pid is 3601 .My parents pid is 1910
Run Code Online (Sandbox Code Playgroud)
为什么父母不在第二行.2420为什么我得到我1910怎么能得到这个价值?