Kernel &引用;在vWork()中,在调用“u exit()之后,子进程永远不会返回到执行过程中”;这是真的吗?

Kernel &引用;在vWork()中,在调用“u exit()之后,子进程永远不会返回到执行过程中”;这是真的吗?,kernel,linux-kernel,fork,Kernel,Linux Kernel,Fork,我正在处理unix系统调用和进程控制。 我知道当调用vWork()时,给子进程的控件,当子进程完成时,它调用_exit(),然后该控件转到父进程 问题1。是:“我想在父进程之后执行子进程”、,可能吗 如果否:在vWork()的情况下,父级和子级如何并发运行??? 如果是:为什么需要使用vWork()(大多数功能与fork()相同) 问题2。我是否知道fork和vfork的流程结构,但不知道在哪里使用它 请帮忙 问题1。是:“我想在父进程之后执行子进程” 很明显,这不是vWork()的目的。但是,

我正在处理unix系统调用和进程控制。 我知道当调用vWork()时,给子进程的控件,当子进程完成时,它调用_exit(),然后该控件转到父进程

问题1。是:“我想在父进程之后执行子进程”、,可能吗

如果否:在vWork()的情况下,父级和子级如何并发运行??? 如果是:为什么需要使用vWork()(大多数功能与fork()相同)

问题2。我是否知道fork和vfork的流程结构,但不知道在哪里使用它

请帮忙

问题1。是:“我想在父进程之后执行子进程”

很明显,这不是
vWork()
的目的。但是,系统调用的exec组(
execl
execv
等)就是这样做的,子进程必须是独立的可执行文件。如果您只希望一件事发生在另一件事之后,则不需要分叉或执行任何事情,只需按正确的顺序排列代码即可;)

问题2。我是否知道fork和vfork的流程结构,但不知道在哪里使用它

vfork()
更加专业化和受限,因此通常您会使用
fork()
。linux vWork手册页提供了有关其使用价值的线索:

vWork()是克隆(2)的特例。它用于创建新的 不复制父进程的页表的进程它 在对性能敏感的应用程序中可能很有用,其中子级 创建,然后立即发出execve(2)。

问题1。是:“我想在父进程之后执行子进程”

很明显,这不是
vWork()
的目的。但是,系统调用的exec组(
execl
execv
等)就是这样做的,子进程必须是独立的可执行文件。如果您只希望一件事发生在另一件事之后,则不需要分叉或执行任何事情,只需按正确的顺序排列代码即可;)

问题2。我是否知道fork和vfork的流程结构,但不知道在哪里使用它

vfork()
更加专业化和受限,因此通常您会使用
fork()
。linux vWork手册页提供了有关其使用价值的线索:

vWork()是克隆(2)的特例。它用于创建新的 不复制父进程的页表的进程它 在对性能敏感的应用程序中可能很有用,其中子级 创建,然后立即发出execve(2)。


问题2的简单答案是:始终使用
fork
。切勿使用
vWork

我不确定你在问题1中到底问了什么。
vWork
ed进程只能使用两个系统调用:
\u exit
execve
。(实际上,它可以使用任何
exec
系列,但
execve
是最常见的。)一旦它做了其中一件事,它要么就死了(
\u exit
),要么就不再是
vWork
exec*
),父级将不再被阻止。因此,一旦孩子有了新的记忆映像,孩子和父母就可以共存了

在正常情况下,孩子将尝试调用
execve
,除非失败,否则永远不会返回,然后立即调用
\u exit
,这仅在
execve
失败时才会发生

子进程不能调用
dup
close
,这通常是正确设置子进程所必需的。它不能修改任何内存(因为内存属于父内存),所以它很少有用

曾几何时,流程创建很慢。如今,它的速度要快得多,大多数类unix操作系统(包括Linux和FreeBSD)都使用“写时复制”,这大大降低了不修改内存(或修改很少内存)的分叉子系统的成本。因此,
vWork
施加的限制和缺乏安全性不再有用

vWork
在2008版中从Posix中删除,应视为已弃用


<>如果你真的发现<代码>叉>代码是一个性能问题,你应该考虑使用<代码> PosixySpAvn< <代码>,如果它在你的系统上可用的话。(据我所知,它可以在最新版本的Linux上使用,在FreeBSD和Solaris上已经使用了很长一段时间。)这实际上可能会调用
vWork
,但它至少可以处理细节而不会导致未定义的行为。

问题2的简单答案是:始终使用
fork
。切勿使用
vWork

我不确定你在问题1中到底问了什么。
vWork
ed进程只能使用两个系统调用:
\u exit
execve
。(实际上,它可以使用任何
exec
系列,但
execve
是最常见的。)一旦它做了其中一件事,它要么就死了(
\u exit
),要么就不再是
vWork
exec*
),父级将不再被阻止。因此,一旦孩子有了新的记忆映像,孩子和父母就可以共存了

在正常情况下,孩子将尝试调用
execve
,除非失败,否则永远不会返回,然后立即调用
\u exit
,这仅在
execve
失败时才会发生

子进程不能调用
dup
close
,这通常是正确设置子进程所必需的。它不能修改任何内存(因为内存属于父内存),因此它是版本