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