为什么 fork 子进程时会出现计时问题

2024-01-04

当我查看“启动工作”的参考资料时gnu.org http://www.gnu.org/software/libc/manual/html_node/Launching-Jobs.html#Launching-Jobs,我没有得到这部分。

shell 还应该调用setpgid将其每个子进程放入新的进程组中。这是因为有一个潜力时间问题:每个子进程在开始执行之前必须放入进程组中新节目,并且 shell 依赖于组中的所有子进程才能继续执行。如果子进程和 shell 都调用 setpgid,则可以确保无论哪个进程首先访问它,都会发生正确的事情。

链接页面有两种方法,launch_job () and launch_process ()。 他们都称setpgid为了防止时间问题.

但我不明白为什么会出现这样的问题。

I guess 新节目意味着结果execvp (p->argv[0], p->argv); in launch_process()。在运行 execvp 之前,setpgid (pid, pgid);总是执行,没有相同的功能launch_job ().

话又说回来,为什么会出现这样的问题呢? (为什么我们必须打电话setpgid (); on launch_job ()任何一个?)


问题是 shell 希望进程位于正确的进程组中。如果 shell 不调用setpgid()在其子进程上,有一个时间窗口,在此期间子进程不属于进程组,而 shell 继续执行。 (通过调用setpgid()shell 可以保证子进程在该调用之后是进程组的一部分)。

还有一个问题,就是子进程可能会执行新的程序(通过exec)在正确设置其进程组 ID 之前(即在父进程调用之前)setpgid())。这就是为什么子进程也应该调用setpgid()(在致电之前exec()).

诚然,描述相当糟糕。这里解决的不仅仅是一个问题;这实际上是两个不同的问题。一 - 父进程(即 shell)希望子进程位于正确的进程组中。第二 - 新程序只有在其进程已放入正确的进程组后才应开始执行。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

为什么 fork 子进程时会出现计时问题 的相关文章

  • django 中的竞争条件

    下面是一个带有潜在竞争条件的 django 视图的简单示例 myapp views py from django contrib auth models import User from my libs import calculate p
  • 将选项传递给分叉的 JVM

    我正在使用 Grails 2 3 5 我需要将一个选项传递给分叉的 JVM 我尝试通过设置 JAVA OPTS 环境变量来做到这一点 但这只是被分叉的 JVM 忽略了 我怎样才能向分叉的 JVM 传递一个选项 我找到了这个链接 现在已经失效
  • Maven Surefire:无法分叉并行测试执行

    使用 Maven Surefire 我无法分叉并行测试执行 也就是说 我的每个测试用例都必须在单独的 JVM 中运行 因此需要分叉 此外 我希望我的测试用例并行运行 第一部分工作没有问题 我能够在自己的 JVM 中运行每个测试用例 然而 第
  • 使用 dup2 时的竞争条件

    这个联机帮助页 http linux die net man 2 dup2为了dup2系统调用说 EBUSY 仅限 Linux 这可能会在执行期间由 dup2 或 dup3 返回 open 2 和 dup 的竞争条件 它谈论什么竞争条件以及
  • 与 fork() 共享堆内存

    我正在努力用 C 语言实现一个数据库服务器 它将处理来自多个客户端的请求 我在用fork 处理单个客户端的连接 服务器将数据存储在堆中 堆由指向动态分配记录的哈希表的根指针组成 记录是具有指向各种数据类型的指针的结构 我希望进程能够共享这些
  • 与 fork() 混淆

    我很难理解 fork 命令在不同场景下的作用 这是我书中的一些示例代码 int main int a 12 int b 9 int fid fork if fid 0 a else wait NULL b b 5 printf progra
  • 为什么fork程序printf执行更多时间[重复]

    这个问题在这里已经有答案了 来自fork 的手册页 http linux die net man 2 fork我读到 fork 创建父进程的副本 但无法理解为什么下面的程序printf执行8次 我读Linux 中 fork 的工作原理 ht
  • 防止 fork() 复制套接字

    我有以下情况 伪代码 function f pid fork if pid 0 exec to another long running executable no communication needed to that process
  • 叉子和线程有什么区别?

    谁能解释一下叉子和线程之间的区别 分叉给你一个全新的进程 它是当前进程的副本 具有相同的代码段 当内存映像发生变化时 通常这是由于两个进程的不同行为 您会分离内存映像 写入时复制 但可执行代码保持不变 任务不会共享内存 除非它们使用某些内存
  • 如何在 if 语句中使用 fork()

    有人可以向我解释一下是什么吗fork 0意思是 据我了解 我认为这意味着 fork 不是 false 吗 或者如果 fork 是 true 那么 我不明白 Fork 如何是 true 或 false 因为它只是将进程的副本创建到父进程和子进
  • 为什么我的编译器不接受 fork(),尽管我包含了

    这是我的代码 只是为了测试 fork 而创建 include
  • fork 和现有线程?

    在linux系统上 子进程查看现有线程的方式与父进程相同吗 int main create thread 1 int child pid fork if 0 child pid else 由于子进程复制了整个地址空间 因此线程的状态会发生什
  • bash fork 炸弹的另一个版本是如何工作的?

    我大致了解如何这个通用版本 https stackoverflow com questions 991142 how does this bash fork bomb work bash fork 炸弹的工作原理 然而 我见过另一个版本 特
  • Visual Studio Code,调试子进程不起作用

    我有这个确切的问题 https github com Microsoft vscode cpptools issues 511 https github com Microsoft vscode cpptools issues 511 但那
  • 单线程程序中可以有竞争条件吗?

    您可以在here https en wikipedia org wiki Race condition Software关于什么是竞争条件的一个很好的解释 我最近看到很多人对竞争条件和线程做出了令人困惑的陈述 我了解到竞争条件只能发生在线程
  • 从多线程程序中调用 system()

    我们正在开发一个用 C 编写的多线程内存消耗应用程序 我们必须执行大量的 shellscript linux 命令 并获取返回码 读完之后article http www linuxprogrammingblog com threads a
  • 分叉/多线程进程|重击

    我想让我的代码的一部分更加高效 我正在考虑让它分叉成多个进程 并让它们一次执行 50 100 次 而不是只执行一次 例如 伪 for line in file do foo foo2 foo3 done 我希望这个 for 循环运行多次 我
  • 同步用户控件中多个属性的绑定

    我的 WPF 用户控件有一个丑陋的竞争条件 它是某种扩展的 ComboBox UserControl主要定义了两个可绑定的DependencyProperties 一个是选中项 另一个是一个列表 可以从列表中选择选中项 两者都是可绑定的 因
  • OpenMP while 循环中的手动同步

    我最近开始使用 OpenMP 为大学的一个项目做一些 研究 我有一个矩形且均匀分布的网格 在该网格上我使用迭代方案求解偏微分方程 因此 我基本上有两个 for 循环 网格的 x 方向和 y 方向各一个 并由 while 循环包裹以进行迭代
  • 如何杀死叉子的孩子?

    我有以下创建子叉的代码 我想在子进程在父进程中完成执行之前杀死它 怎么做 include

随机推荐