问题标签 [vfork]
For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.
c - 当 posix_spawn 只是 fork + exec 的包装器时,为什么它会更快?
这实际上是一个两部分的问题。
- 当它本身只是 + 的包装时,为什么
posix_spawn()
比手写更快?fork()
exec()
posix_spawn()
fork()
exec()
- 为什么
posix_spawn()
用POSIX_SPAWN_USEVFORK
比正常手写慢的vfork()
+exec()
?
根据Ruby posix spawning library的工作,它似乎posix_spawn()
提供了一致的吞吐量。我阅读了 glibc 的源代码,但我找不到任何明显的提供这种一致性的东西。有人可以向我解释吗?
我制作了一个小的测试源文件(对于这里来说太大,所以 GitHub),并让它运行大约 30 次 - 每次调用/bin/true
几次(1000-10000 之间的随机数) - 然后将总时间除以总迭代次数。结果如下所示。它在没有附加任何附加功能的普通 Linux Mint 桌面上运行。
我收集了认为vfork()
是架构缺陷的手册页,但对于我的用例来说,它很好。
在这里,v
前缀是 usingvfork()
和n
prefix 是 normal fork()
。
vfork - vfork() 的返回类型
来自 GNU 手册:
vfork() 函数与 fork(2) 具有相同的效果,除了如果由 vfork() 创建的进程修改任何数据而不是用于存储来自 vfork() 的返回值的 pid_t 类型的变量,则行为未定义,
这是什么意思?这是否意味着 的返回值vfork()
不能分配给非pid_t
类型变量?
c - vfork 与 fork 的文件描述符表
我是系统编程的新手,在 fork 和 vfork 中遇到了一些误解。
- 据我所知,fork 重复父进程的进程和子进程有自己的虚拟机和自己的文件描述符表。
- 至于vfork,它共享父进程的VM,但子进程将有自己的文件描述符表。
那么问题来了:
- 由于子进程共享父进程的地址,为什么它需要自己的文件描述符表?
- 如果我在子进程中声明一个变量,该变量将存储在哪里?(它会使用父进程的空间吗)非常感谢。
process - 为什么在 fork() 之后为不同的进程设置不同的变量?
我遇到了一个看起来像这样的代码
根据我对堆栈溢出的了解,我可以看出父进程和子进程的 char 值会有所不同。孩子的价值是'C',父母的价值是'P'。我也可以告诉父母和孩子的地址应该是相同的,即'sharedVariable'(&sharedVariable)的地址。
但是,这是我的问题。
- 将不同的 char 值分配给不同的进程有什么意义?因为一方面,既然我们已经可以通过 pid==0 或 >0 来识别每个进程,那么这一步不是冗余吗?另一个原因是我认为区分两个执行相同工作的进程没有意义,如果不让程序员将它们区分开来,它们就不能工作吗?
- 为什么让父母和孩子的地址保持不变?我可以建议,因为假设他们继续执行类似的任务,这样做会很方便,因为这样我们就可以复制和粘贴代码。我很犹豫,想确认一下。
- 如果我用 vfork() 替换了 fork(),那么父级 char 值的结果会是“C”吗?
提前一百万谢谢。
c - fork子能判断是fork还是vfork吗?
在子进程中,有什么方法可以确定它是作为具有覆盖内存的 fork 还是作为具有共享内存的 vfork 启动的?
基本上,我们的日志引擎需要在 vfork 中更加小心(而不是记录某些类别的活动)。在 fork 中,它需要以 vfork 中没有的方式与父进程合作。我们知道如何做这两件事,但不知道如何决定。
我知道我可能会拦截 fork/vfork/clone 调用,并将 fork/vfork/mapping 状态存储为一个标志,但如果有一个 API 调用孩子可以进行以确定其自己的状态,它会使生活变得更简单。
额外标记:理想情况下,我还需要在库中找到任何已完成 fork 或 vfork 的地方,然后将其回调到我们的代码中。那怎么会发生呢?我们拥有的至少一个库提供了一个类似 popen 的 API,其中客户端回调在 exec 之前从 fork 子调用。显然,该回调的实用性在 vfork 中受到很大限制。