Chr*_*s T 4 c unix pid waitpid
我正在我的系统编程课程中学习forks
,execl
以及父进程和子进程。令我困惑的一件事是waitpid()
和getpid()
。有人可以确认或更正我对这两个功能的理解吗?
getpid()将返回调用它的任何进程的进程 ID。如果父级调用它,则返回父级的 pid。对孩子也一样。(pid_t
根据联机帮助页,它实际上返回一个 type 值)。
waitpid()似乎更复杂。我知道如果我在父进程中使用它,没有任何标志来防止它阻塞(使用WNOHANG
),它将停止父进程,直到子进程终止。waitpid()
然而,我有点不确定如何管理这一切。waitpid()
也返回pid_t
。pid_t
waitpid()
回报的价值是多少?根据父进程或子进程是否调用它,以及子进程是否仍在运行或已终止,这种情况如何变化?
你的理解getpid
是对的,它返回的是正在运行的进程的PID。
waitpid
用于(如您所说)阻止进程的执行(除非
WNOHANG
通过)并在进程的(或更多)子进程结束时恢复执行。waitpid
返回pid
状态改变的孩子的 ,失败时返回-1。如果WNOHANG
已指定但子级未更改状态,它也可以返回 0 。看:
男人等待
返回值
waitpid()
:成功时,返回状态改变的子进程ID;如果WNOHANG
已指定并且 pid 指定的一个或多个 child(ren) 存在,但尚未更改状态,则返回 0。 出错时,返回-1。
根据传递给 的参数waitpid
,它的行为会有所不同。这里我再次引用手册页:
男人等待
Run Code Online (Sandbox Code Playgroud)pid_t waitpid(pid_t pid, int *wstatus, int options);
...
该
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()
。
这些函数的行为在手册页中有很好的解释,我引用了其中的重要部分。您应该阅读整个手册页以更好地理解它。