正确理解 waitpid() 和 getpid()

Chr*_*s T 4 c unix pid waitpid

我正在我的系统编程课程中学习forks,execl以及父进程和子进程。令我困惑的一件事是waitpid()getpid()。有人可以确认或更正我对这两个功能的理解吗?

getpid()将返回调用它的任何进程的进程 ID。如果父级调用它,则返回父级的 pid。对孩子也一样。(pid_t根据联机帮助页,它实际上返回一个 type 值)。

waitpid()似乎更复杂。我知道如果我在父进程中使用它,没有任何标志来防止它阻塞(使用WNOHANG),它将停止父进程,直到子进程终止。waitpid()然而,我有点不确定如何管理这一切。waitpid()也返回pid_tpid_t waitpid()回报的价值是多少?根据父进程或子进程是否调用它,以及子进程是否仍在运行或已终止,这种情况如何变化?

Pab*_*blo 5

你的理解getpid是对的,它返回的是正在运行的进程的PID。

waitpid用于(如您所说)阻止进程的执行(除非 WNOHANG通过)并在进程的(或更多)子进程结束时恢复执行。waitpid返回pid状态改变的孩子的 ,失败时返回-1。如果WNOHANG已指定但子级未更改状态,它也可以返回 0 。看:

男人等待

返回值

waitpid():成功时,返回状态改变的子进程ID;如果WNOHANG 已指定并且 pid 指定的一个或多个 child(ren) 存在,但尚未更改状态,则返回 0。 出错时,返回-1。

根据传递给 的参数waitpid,它的行为会有所不同。这里我再次引用手册页:

男人等待

pid_t waitpid(pid_t pid, int *wstatus, int options);
Run Code Online (Sandbox Code Playgroud)

...

waitpid()调用进程的系统调用挂起执行,直至由PID参数指定的子状态发生了改变。默认情况下,waitpid()仅等待终止的子进程,但此行为可通过 options 参数进行修改,如下所述:

pid 的值可以是:

  • < -1: 表示等待进程组 ID 等于 的绝对值的任何子进程pid
  • -1: 表示等待任何子进程。
  • 0: 表示等待进程组 ID 等于调用进程组 ID 的任何子进程。
  • > 0: 表示等待进程 ID 等于 pid 值的子进程。

的值options是以下零个或多个常量的 OR:

  • WNOHANG: 如果没有孩子退出,立即返回。
  • WUNTRACED 如果孩子已停止(但未通过 ptrace(2) 跟踪),也返回。即使未指定此选项,也会提供已停止的跟踪子项的状态。
  • WCONTINUED(自 Linux 2.6.10 起)如果停止的孩子已通过交付SIGCONT.
  • 我有点不确定 waitpid() 如何管理所有这些

waitpid 是一个系统调用,操作系统会处理它。

  • 根据父进程或子进程是否调用它,以及子进程是否仍在运行或已终止,这种情况如何变化?

wait只应由已执行的进程调用fork()。所以父进程应该 cal wait()/ waitpid。如果子进程没有调用 fork(),那么它不需要调用这些函数中的任何一个。然而,如果子进程已经调用fork(),那么它也应该调用 wait()/ waitpid()

这些函数的行为在手册页中有很好的解释,我引用了其中的重要部分。您应该阅读整个手册页以更好地理解它。