首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >是否有可能采用一种程序?

是否有可能采用一种程序?
EN

Stack Overflow用户
提问于 2012-05-09 16:05:46
回答 3查看 3.1K关注 0票数 26

过程Afork()的过程B。

A工艺模具,因此init采用B工艺。

看门狗创建进程C。

C是否有可能采用init中的B

更新

或者,如果C是在A死之前创建的,而不让init成为B的中间父母,那么甚至可以让C直接采用B吗?

更新-1:

此外,我希望有任何评论,为什么有可能采用我所描述的过程将是一件坏事,或难以实现。

更新-2-用例(父和子引用过程(Es)):

我有一个应用程序,使用家长来管理一整群孩子,这依赖于家长的管理设施。要完成它的工作,父母依赖于孩子的终止通知,这是通过接收相关的SIGCHLD信号来完成的。

如果父母本身因某些事故(包括分段故障)而死亡,我需要重新启动整个“家庭”,因为现在不可能在孩子的终止(这也可能是分段错误)上触发一些东西。

在这种情况下,我需要打倒所有的孩子,做一个完整的系统重新启动。

避免这种情况的一种可能的方法,将是有一个备用的过程,可以取代死去的父母的角色.-如果它能再次接收孩子们的SIGCHLD信号!

EN

回答 3

Stack Overflow用户

发布于 2012-05-11 11:00:01

不,绝对不可能。如果没有一些令人讨厌的竞赛条件,它也无法实现。编写这些API的POSIX人员永远不会创建具有固有竞争条件的东西,因此即使您不介意,您的内核也不会很快得到它。

一个问题是pids被重用(它们是一个稀缺的资源!),而且您也无法获得一个句柄或锁定一个句柄;它只是一个数字。因此,比方说,在代码中的某个地方,您有一个变量,在该变量中,您要重新创建进程的pid。然后打电话给make_this_a_child_of_me(thepid)。那会发生什么呢?同时,另一个进程可能已经退出,thepid更改为引用其他进程!糟了。如果不对make_this_a_child_of_me处理进程的方式进行大规模重组,就不可能有提供unix的方法。

请注意,在子wait上处理pids的整个过程恰恰是为了防止这个问题:进程表中仍然存在一个僵尸进程,以防止它的pid被重用。然后,父进程可以通过它的pid引用其子进程,确信进程不会退出并重用子pid。如果子程序确实退出,那么它的pid将被保留,直到父程序捕获SIGCHLD,或者等待它。一旦进程被收获,它的pid将立即被抓取,以便其他程序在分叉时开始使用,但是父程序肯定已经知道了。

响应更新:考虑一个更复杂的方案,其中进程被修复到它们的下一个祖先。显然,这并不是每一种情况下都能做到的,因为你经常想要一种不承认一个孩子的方式,以确保你避免僵尸。它很好地发挥了这一作用。因此,在某种程度上,一个过程必须指明它是否打算收养它的孙子(或更低的)。这个设计的问题和第一种情况完全一样:你仍然有比赛条件。

如果它再次由pid完成,则祖父母将自己暴露在一个竞赛条件中:只有父进程能够获得pid,因此只有父进程才真正知道pid与哪个进程一起进行。因为祖父母不能收获,所以不能确定外孙进程是否与它打算采用的进程(或者不承认,取决于假设API的工作方式)是否有变化。记住,在一台负载很重的机器上,没有什么能阻止进程被从CPU中取出几分钟,而整个负载在这段时间内可能已经改变了!不太理想,但是POSIX必须解释清楚。

最后,假设这个API不按pid工作,而只是一般地说,“把所有的孙辈都送给我”或者“把他们送到init”。如果在生成子进程之后调用它,那么您将得到与以前一样的争用条件。如果它以前被调用过,那么整个过程都是无用的:您应该能够稍微重构应用程序,以获得相同的行为。也就是说,如果你知道在你开始产卵之前,谁应该是孩子的父母,你为什么就不能一开始就开始创造正确的方式呢?管道和IPC确实能够完成所有所需的工作。

票数 17
EN

Stack Overflow用户

发布于 2012-05-09 16:13:21

不,你不可能以你所描述的方式来实施教养。

票数 8
EN

Stack Overflow用户

发布于 2020-11-16 17:13:04

我不知道有什么好的方法来做到这一点,但是让它运行的一个原因是进程可以独立运行,或者向父进程添加功能。收养将作为事件的结果发生,由(尚未)子事件知道,而不是父事件。即将出生的孩子会向父母发出一个信号。父母会收养(或不收养)孩子。一旦父进程成为父进程的一部分,父进程/子进程就能够对事件做出反应,而当单独存在时,两者都不能对事件作出反应。

这种对接行为可以被编码到应用程序中,但我不知道如何实时实现。还有其他方法可以实现相同的功能。可以接受停靠子的父级可以以父级以前不知道的新方式扩展其功能。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10519842

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档