在我的系统编程类中,我正在学习forks、execl以及父进程和子进程。有一件事让我很困惑,那就是waitpid()和getpid()。有人能证实或纠正我对这两种功能的理解吗?
getpid()将返回任何进程调用它的进程ID。如果父级调用它,则返回父级的pid。对孩子也是如此。(根据手册,它实际上返回一个pid_t类型的值)。
waitpid()看起来更复杂。我知道,如果我在父进程中使用它,没有任何标志来阻止它阻塞(使用WNOHANG),它将停止父进程直到子进程终止。不过,我有点不确定waitpid()是如何管理这一切的。waitpid()还返回pid_t。pid_t waitpid()返回的值是多少?这取决于父进程或子进程是否调用它,以及子进程是否仍在运行,或是否已终止。
发布于 2018-03-23 23:15:58
您对getpid的理解是正确的,它返回运行过程的PID。
waitpid用于阻止进程的执行(除非传递WNOHANG ),并在进程(或更多的)子进程结束时恢复执行。waitpid返回状态已更改的子级的pid,失败时返回-1。如果WNOHANG指定了状态,但子节点没有更改状态,它也可以返回0。请参见:
男侍者 返回值
WNOHANG:waitpid():在成功时,返回状态已更改的子进程ID;如果指定了,并且存在pid指定的一个或多个子级(Ren),但尚未更改状态,则返回0。错误时返回,返回-1。
根据传递给waitpid的参数,它的行为将有所不同。在这里,我再次引用手册:
男侍者 pid_t等待pid(pid_t pid,int *wstatus,int选项); ..。
waitpid()系统调用将暂停调用进程的执行,直到pid参数指定的子进程已更改状态为止。默认情况下,waitpid()只等待终止的子级,但此行为可以通过options参数进行修改,如下所述: pid的值可以是:
< -1:意思是等待进程组ID等于pid绝对值的任何子进程。-1:意思是等待任何子进程。0:意思是等待进程组ID等于调用进程的任何子进程。> 0:意思是等待进程ID等于pid值的子进程。options的值是以下常量中的零或多个的OR:
WNOHANG:如果没有孩子退出,立即返回。WUNTRACED也会返回(但不会通过ptrace(2)进行跟踪)。即使未指定此选项,也将提供已停止的跟踪子程序的状态。WCONTINUED (自Linux2.6.10之后)如果已通过交付SIGCONT恢复已停止的子级,也会返回。waitpid是一个syscall,操作系统负责处理这个问题。
wait只应由已执行fork()的进程调用。因此父进程应该是cal wait()/waitpid。如果子进程没有调用fork(),那么它就不需要调用这些函数中的任何一个。但是,如果子进程调用了fork(),那么它也应该调用wait()/waitpid()。
这些函数的行为在手册中有很好的解释,我引用了其中的重要部分。你应该阅读整页手册才能更好地理解它。
发布于 2018-03-23 23:09:07
waitpid“只能返回子进程的状态”(从POSIX规范)。因此,pid_t等待返回属于调用waitpid的进程的当前或以前的子进程之一。例如,如果一个子节点最近终止了,它将返回该子节点的PID。
只有从父进程调用waitpid才有用。如果从没有任何子进程的进程调用,则返回ECHILD。
waitpid可以检查已终止或最近停止或继续的子程序的状态(例如,^Z从shell)。规范中的各种pid/选项参数组合告诉您可以返回的各种类型的信息。例如,WCONTINUED选项请求最近连续的子级而不是最近终止的子级的状态。
https://stackoverflow.com/questions/49459392
复制相似问题