问题标签 [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 投票
1 回答
236 浏览

c++ - vfork 导致内存“free()”崩溃,但 fork 没有,它是怎么发生的?

我试图查看 vfork 是否创建了一个与父进程共享内存的子进程,如下所示:

我希望如果 i 和 *pi 的值在父进程和子进程之间共享,但是当我执行它时: $ g++ myvshare.cpp && ./a.out

我感到困惑的是:

  1. 我希望 vfork 应该与 fork 不同,因为 i 和 *pi 是共享的。但是 vfork 似乎仍然对 i 和 *pi 有 COW,当父亲设置值时,孩子仍然获得旧值,反之亦然。

  2. 为什么有一个核心转储说“free()”失败了?我尝试将 vfork 更改为 fork,没有这样的问题。这是如何发生的,在 libc 或 glibc 中?

谢谢!

0 投票
1 回答
123 浏览

linux-kernel - 从 systemtap 中的 nd_syscall.vfork.return 获取新的 pid

我试图从一个奇怪的 makefile 中提取东西,我发现 systemtap 是一个潜在的好解决方案,所以我在这里:

使用 探测时,我可以pid() ppid()从新进程中正确调用nd_syscall.clone.return,但这不包括我在目标脚本中找到的所有 vfork。

因此,当我使用 probe 时nd_syscall.vfork.return,我发现该消息具有克隆调用者的pid(),并且ppid()只有,我试图获取 vfork 的返回值,但它似乎不是新的 pid(我从很多人那里看到相关的 execve 事件)。

我不能使用kprocess,因为我不想安装调试信息。

有什么方法可以从 vfork 获得正确的 new_pid?我错过了一些参数吗?还是我使用了错误的探测功能?一定有办法,谢谢!

PS 我试过 sysdig 但它跳过了很多事件顺便说一句。

0 投票
1 回答
42 浏览

process - 使用 vfork() 的多个进程

我正在尝试在运行 uClinux 的 SmartFusion2 SOM 上运行多个进程,但我只能在其上使用 vfork() 而不能使用 fork()。我一直在尝试运行以下代码来测试运行多个进程,但我没有得到我想要的结果。该代码应该同时运行两个不同的程序,但我遇到了 SEGV 错误。

这是代码:

它编译得很好,但我的输出看起来像这样:

有人可以帮我看看我做错了什么吗?

0 投票
2 回答
944 浏览

c - 关于 vfork() 系统调用?

输出:

我的问题:为什么在父进程执行后打印“hello”?我已经开始学习 vfork()。谁能帮我解决这个问题?

0 投票
1 回答
431 浏览

c - 我可以在 vfork 之后调用 dup2 吗?

我想要vfork()一个子进程,但它stdout与父进程不同stdout

实现这一点的明显方法fork()是在分叉后在子级中dup2()(和close()原始文件描述符)。

假设我在调用之前准备好文件描述符,vfork()并且只需要在调用exec*()函数之前调用这两个系统调用。我可以这样做吗?

0 投票
1 回答
1023 浏览

linux-kernel - 为什么较新的 glibc 使用 vfork 而不是 fork 实现 posix_spawn?

我正在跟踪 glibc 2.17 和 glibc 2.27 中的 posix_spawn 源代码。

(glibc 2.17:sysdeps/posix/spawni.c)

(glibc 2.27:sysdeps/unix/sysv/linux/spawni.c)

我发现 glibc 2.17 根据标志和文件操作使用 vfork 或 fork。

我猜这是由于多线程安全或竞争条件。

但在 glibc 2.27 中,它只使用 vfork 创建子进程。

为什么 glibc 会改变实现?

较新的 linux 内核是否能更好地保护 vfork 免受竞争条件的影响?

0 投票
0 回答
57 浏览

exec - vfork() 之后的 exec() 对父级内存的影响

我目前正在阅读 Silberschatz 的关于虚拟内存的操作系统章节。

这里指出:

"使用vfork(),父进程挂起,子进程使用父进程的地址空间。因为vfork()不使用copy-on-write,如果子进程改变了父地址空间的任何页,一旦恢复,更改的页面将对父级可见。

[...] Vfork() 旨在在子进程在创建后立即调用 exec() 时使用。"

如果我没记错的话,exec() 将替换当前的进程映像。

因此,由于地址空间是共享的,因此在随后的 exec() 调用中调用 vfork() 并替换父进程映像?

0 投票
2 回答
1922 浏览

c - 如何使用 SIGALRM 终止程序

所以基本上我的程序中有 4-5 个函数。这是很多行代码以及从文件中读取和写入的内容,它可能以无限循环结束(更糟糕的情况),如果它超过 20 秒,我想终止我的程序。下面的代码不起作用,我的程序挂起,操作系统为我终止它,而不是程序自行终止。我认为我遇到的主要问题是在主程序中设置了警报,当达到警报时间限制时,进程正在另一个函数中执行,这导致程序在没有关闭文件并杀死子进程的情况下关闭。这就是我现在所拥有的:

0 投票
1 回答
125 浏览

c - 如何判断一个函数是否在 vfork()'ed 进程中被调用?

我有一个用于 C 的插入器库。无法插入vfork(),因为vfork()(插入函数)在调用 real 之后无法返回调用函数vfork()。但我正在介入_exit(),因为我需要知道该过程何时结束。当然,我正在插入exec*()功能。我的问题是,当插入时_exit(),我想做某些事情,当_exit()被正常进程调用时,而不是当进程是受限制vfork()的进程时。

如何在 C 程序中判断我的进程何时是vfork()'ed 进程以及何时我无权访问由返回的进程 ID vfork()

中介层库:

测试二进制:

0 投票
3 回答
208 浏览

c - 带有 vfork() 和 -lpthread 的孙子的 getpid() 结果不正确

在下面显示的一种特殊情况下,getpid()对于使用创建的孙子vfork()进程返回父进程的 PID。

编译为gcc main.c,这按预期工作:

编译为gcc main.c -lpthread,孙子 PID 不正确:

任何线索为什么?这是未定义的行为案例之一吗?

使用psstrace,我可以看到正确的 PID。顺便说一句,相同的示例代码适用于fork(),即无论是否正确getpid(),都可以正常工作-lpthread