问题标签 [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.

0 投票
2 回答
185 浏览

c - 在 vfork 中,孩子被重复创建

任何人都可以解释以下代码:

在上面的代码中,子进程是重复创建的。谁能帮我理解逻辑?

0 投票
2 回答
329 浏览

c - 在函数中调用 vfork(),对结果感到困惑

这是“APUE”第 8 章(练习 8.2,第 2 版)中的练习。全部说明是:

回忆一下图 7.6 中典型的内存排列。因为每个函数调用对应的栈帧通常都存储在栈中,并且因为在 vfork 之后子进程在父进程的地址空间中运行,如果对 vfork 的调用来自除 main 之外的函数并且子进程执行了会发生什么情况在 vfork 之后从这个函数返回?编写一个测试程序来验证这一点,并画出正在发生的事情。

在我的程序中:

我运行程序,输出为:

我对输出感到困惑。

  1. print f1 address: xxx,我们调用 vfork() ,子进程首先运行。
  2. print f2 address: xxx,然后子进程调用 _exit(0)。
  3. 主进程从 f1() 返回,f1 的堆栈帧被 f2 更改,可能导致分段错误。

但是为什么要打印f1 address: 4196604两次,为什么 f1 和 f2 的地址不一样呢?

0 投票
0 回答
71 浏览

linux - vfork - 暂停调用进程或调用线程?

vfork sayas 的手册页:“vfork - 创建子进程并阻止父进程”在下面的描述“vfork() 与 fork(2) 不同之处在于调用线程被挂起”

在大多数文档中,它说“暂停进程”

那么,哪一个是真的?答案是否取决于 Linux 版本?

感谢 zmau

0 投票
2 回答
452 浏览

c - 需要澄清关于 vfork 的使用

我想比父进程更早地运行子进程。我只想使用来自子进程的 execv 调用,所以我使用 vfork 而不是 fork。

但是假设 execv 失败并返回,我想从我正在调用 vfork 的函数中返回非零值。

像这样的东西,

上面的代码是正确的,还是我应该使用其他机制来比父母更早地运行孩子?

在某些链接上,我读过,我们不应该修改通过 vfork 创建的子进程中的任何父资源(我正在修改 err 变量)。

0 投票
6 回答
8545 浏览

c - 使用 fork(),我怎样才能让子进程总是先运行?

子进程和父进程执行是并行的,首先启动取决于操作系统调度。但是可以做些什么来让孩子总是在父母之前开始呢?

这是我的问题的伪代码,

我想让第一个 execv 先执行,然后父级再次创建新进程。每个 execv 都应该按顺序排列。

0 投票
1 回答
7101 浏览

c - C 程序中的 fork 与 vfork 功能

我正在做一些自学的C练习,遇到了以下问题:

第一部分:

b部分:

我们必须比较 和 的line a输出line b

a部分的输出是:

b部分的输出是:

它出现在 a 部分中,总和是 and 的初始声明的总和ab而在 b 部分中,总和包括子进程内的总和。

我的问题是 - 为什么会发生这种情况?

根据这篇文章

两者的基本区别在于,当使用 vfork() 创建新进程时,父进程会暂时挂起,子进程可能会借用父进程的地址空间。这种奇怪的事态一直持续到子进程退出或调用 execve(),此时父进程继续。

父进程的定义暂时中止对我来说没有多大意义。这是否意味着对于1b,程序在父进程运行之前一直等到子进程完成运行(因此为什么子进程变量被求和)?

问题陈述还假设“由内核维护的父进程的进程ID为2500,并且新进程是在子进程创建之前由操作系统创建的”。

根据这个定义,这v两个程序的价值是多少?

0 投票
1 回答
1176 浏览

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 泄漏。如果速度快就更好了。

0 投票
1 回答
300 浏览

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。

0 投票
1 回答
252 浏览

linux - vfork() 失败,错误号 513

在基于 RHEL 6.6 的环境中,我们从一个由 XML rpc 服务器创建的线程执行 IO。线程执行执行 vfork() 的外部命令。vfork() 系统调用失败,错误号为 513。

可能的原因是什么?

0 投票
2 回答
656 浏览

c - 为什么 vfork() 给出分段错误

当我运行以下代码时

我知道除非调用 exec() 或 _exit() ,否则如果我们尝试修改任何变量,vfork() 可能会以奇怪的方式表现,但有人可以解释一下到底发生了什么吗?为什么 hello world 被打印了 3 次?是因为 printf() 正在缓冲吗?最后为什么当父母试图返回时会发生段错误?