我在阅读 Richard Stevens“UNIX 环境中的高级编程”时发现了这个主题。
*8.13。系统功能
*****由于系统是通过调用fork、exec、waitpid实现的,所以返回值分为三种。**
<强>1。如果 fork 失败或 waitpid 返回 EINTR 以外的错误,系统返回 –1 并设置 errno 以指示错误。
<强>2。如果 exec 失败,意味着 shell 无法执行,返回值就像 shell 执行了 exit(127) 一样。
**3。否则,fork、exec 和 waitpid 三个函数都成功,system 的返回值是 shell 的终止状态,以 waitpid 指定的格式。******
据我了解,我们通过 cmdstring name 和 exec() 来fork() 一个进程,使其与父进程分离。
但是无法弄清楚 waitpid() 函数 是如何成为 system() 函数 调用的一部分的?
以下链接ambiguous constructor call while object creation没有给我正确答案。
最佳答案
在您关闭 fork()
后,您的原始流程会立即继续,即 fork()
立即返回。此时,新进程仍在运行。由于 system()
应该是同步的,即必须仅在执行的程序完成后 返回,因此原始程序现在需要调用 waitpid()
在等待其终止的新进程的 PID 上。
在图片中:
[main process]
.
.
.
fork() [new process]
A
/ \
| \
| \___ exec()
waitpid() .
z .
z . (running)
z .
z Done!
z |
+----<----<---+
|
V
(continue)
关于c++ - linux中system()函数中waitpid()函数是如何实现的,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/18365595/