c++ - linux中system()函数中waitpid()函数是如何实现的

标签 c++ c linux

我在阅读 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 nameexec()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/

相关文章:

python - Linux 上文件的默认缓冲区大小

c - Linux USB 设备驱动的误解

c++ - 从文本文件中读取特定条目

c++ - 如何正确删除那些指针?

C++零初始化 - 为什么这个程序中的 `b`未初始化,但 `a`已初始化?

c - 覆盖 GCC 的可变参数参数提升

C - 自定义类型中的默认值

c - 在我的代码中出现段错误

python - 在 Python 中,getresponse() 返回什么?

c++ - 区别 SAFE_RELEASE(), SAFE_DELETE()