vfork()
函数的效果与fork(2)
相同,但如果该进程调用任何其他函数而未成功调用exec(3)
函数族中的任何一个,则其行为是未定义的。
这表明在vfork()
之后调用任何exec*()
函数都是可以接受的。然而,在man页面的后面,它特别指出:
特别是,程序员不能依赖于父进程保持阻塞状态,直到子进程调用
execve(2)
为止[...]。
execve(2)
在man页面中被反复使用,其用法表明它是在vfork()
之后唯一可接受的exec
类型函数。
那么为什么要在这里选择execve
,我是否可以安全地调用其他exec
类型函数(如execlp
)?
vfork
不符合POSIX标准吗?难道man手册不应该更新以删除具有误导性的部分(“exec(3)
函数族之一”)吗? - Cornstalksvfork
。也许它确实满足那些旧的要求,但我不一定会期望它能够满足。你可能需要阅读源代码,即使这样也可能会发生变化,所以我不会这么做。不要使用vfork
。它是危险和相当无用的。 - R.. GitHub STOP HELPING ICEvfork
在你的程序需要通过例如cygwin
或mingw
移植到微软的 Windows 操作系统时非常有用,因为在微软的操作系统上fork
非常非常非常慢。然而,我建议找一个库,在单个调用中执行pipe
、vfork
、exec
等操作,以避免混乱。 - ctrl-alt-delorposix_spawn
。或者你可以尝试使用midipix,在这里fork
不会极其缓慢和有问题。 - R.. GitHub STOP HELPING ICEman signal-safety
中列出的大多数函数都可以与vfork()一起安全使用,只有少数像read()这样的函数需要使用pread()代替。posix_spawn是一个令人不快的API,xnu是我见过唯一支持它的内核。学习vfork(),因为它非常快速且像C语言的其他部分一样得到了广泛支持。查看Almquist Shell的源代码(在Linux和FreeBSD上是/bin/sh),以了解哪些行为是事实上保证的。 - Justine Tunney