问题标签 [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 - 在 vfork 中,孩子被重复创建
任何人都可以解释以下代码:
在上面的代码中,子进程是重复创建的。谁能帮我理解逻辑?
c - 在函数中调用 vfork(),对结果感到困惑
这是“APUE”第 8 章(练习 8.2,第 2 版)中的练习。全部说明是:
回忆一下图 7.6 中典型的内存排列。因为每个函数调用对应的栈帧通常都存储在栈中,并且因为在 vfork 之后子进程在父进程的地址空间中运行,如果对 vfork 的调用来自除 main 之外的函数并且子进程执行了会发生什么情况在 vfork 之后从这个函数返回?编写一个测试程序来验证这一点,并画出正在发生的事情。
在我的程序中:
我运行程序,输出为:
我对输出感到困惑。
- print
f1 address: xxx
,我们调用 vfork() ,子进程首先运行。 - print
f2 address: xxx
,然后子进程调用 _exit(0)。 - 主进程从 f1() 返回,f1 的堆栈帧被 f2 更改,可能导致分段错误。
但是为什么要打印f1 address: 4196604
两次,为什么 f1 和 f2 的地址不一样呢?
linux - vfork - 暂停调用进程或调用线程?
vfork sayas 的手册页:“vfork - 创建子进程并阻止父进程”在下面的描述“vfork() 与 fork(2) 不同之处在于调用线程被挂起”
在大多数文档中,它说“暂停进程”
那么,哪一个是真的?答案是否取决于 Linux 版本?
感谢 zmau
c - 需要澄清关于 vfork 的使用
我想比父进程更早地运行子进程。我只想使用来自子进程的 execv 调用,所以我使用 vfork 而不是 fork。
但是假设 execv 失败并返回,我想从我正在调用 vfork 的函数中返回非零值。
像这样的东西,
上面的代码是正确的,还是我应该使用其他机制来比父母更早地运行孩子?
在某些链接上,我读过,我们不应该修改通过 vfork 创建的子进程中的任何父资源(我正在修改 err 变量)。
c - 使用 fork(),我怎样才能让子进程总是先运行?
子进程和父进程执行是并行的,首先启动取决于操作系统调度。但是可以做些什么来让孩子总是在父母之前开始呢?
这是我的问题的伪代码,
我想让第一个 execv 先执行,然后父级再次创建新进程。每个 execv 都应该按顺序排列。
c - C 程序中的 fork 与 vfork 功能
我正在做一些自学的C练习,遇到了以下问题:
第一部分:
b部分:
我们必须比较 和 的line a
输出line b
。
a部分的输出是:
b部分的输出是:
它出现在 a 部分中,总和是 and 的初始声明的总和a
,b
而在 b 部分中,总和包括子进程内的总和。
我的问题是 - 为什么会发生这种情况?
根据这篇文章:
两者的基本区别在于,当使用 vfork() 创建新进程时,父进程会暂时挂起,子进程可能会借用父进程的地址空间。这种奇怪的事态一直持续到子进程退出或调用 execve(),此时父进程继续。
父进程的定义暂时中止对我来说没有多大意义。这是否意味着对于1b
,程序在父进程运行之前一直等到子进程完成运行(因此为什么子进程变量被求和)?
问题陈述还假设“由内核维护的父进程的进程ID为2500
,并且新进程是在子进程创建之前由操作系统创建的”。
根据这个定义,这v
两个程序的价值是多少?
popen - popen() 实现、fd 泄漏和 vfork()
在 的 glibc 实现中popen()
,它指定
popen() 函数应确保在父进程中保持打开的先前 popen() 调用的任何流在新的子进程中关闭。
为什么?如果目的是避免 fd 泄漏,为什么不关闭所有打开的 fd?
popen()
使用的 glibc 实现fork()
。虽然 and 之间有dup2()
andclose()
调用fork()
,exec()
是否可以替换fork()
byvfork()
来提高性能?
Linux 的实现是popen()
基于fork()
而不是vfork()
?为什么或者为什么不)?
我将编写 的双向版本popen()
,它返回两个FILE*
:一个用于读取,一个用于写入。如何正确实施?它应该是线程安全的并且没有 fd 泄漏。如果速度快就更好了。
c - Busybox udhcpd vfork 启动两个进程
在我的应用程序中,我需要启动 Busybox udhcpd(dhcp 服务器),代码如下。虽然 udhcpd 确实启动并运行,但我在进程列表中获得了两个版本。udhcpd 运行正常,即为设备分配了 IP 地址。
日志输出
UDHCPD 以 PID 开始:647 (PID=528)
PS输出
现在,如果我查看 /var/run/udhcpd.pid,它的 pid 为 648。在我们代码的另一部分,我们使用与上面相同的代码启动 dhcpcd(dhcp 客户端),它在进程列表中只有一个条目。谁能解释有什么区别,如果我做错了我应该做什么?
问的原因是我需要稍后停止 udhcpd,看来我需要停止使用孩子的 pid (647) 以及从 /var/run/udhcpd.pid (648) 读取的 pid。
linux - vfork() 失败,错误号 513
在基于 RHEL 6.6 的环境中,我们从一个由 XML rpc 服务器创建的线程执行 IO。线程执行执行 vfork() 的外部命令。vfork() 系统调用失败,错误号为 513。
可能的原因是什么?
c - 为什么 vfork() 给出分段错误
当我运行以下代码时
我知道除非调用 exec() 或 _exit() ,否则如果我们尝试修改任何变量,vfork() 可能会以奇怪的方式表现,但有人可以解释一下到底发生了什么吗?为什么 hello world 被打印了 3 次?是因为 printf() 正在缓冲吗?最后为什么当父母试图返回时会发生段错误?