首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >正确理解waitpid()和getpid()

正确理解waitpid()和getpid()
EN

Stack Overflow用户
提问于 2018-03-23 23:02:20
回答 2查看 3.1K关注 0票数 4

在我的系统编程类中,我正在学习forksexecl以及父进程和子进程。有一件事让我很困惑,那就是waitpid()getpid()。有人能证实或纠正我对这两种功能的理解吗?

getpid()将返回任何进程调用它的进程ID。如果父级调用它,则返回父级的pid。对孩子也是如此。(根据手册,它实际上返回一个pid_t类型的值)。

waitpid()看起来更复杂。我知道,如果我在父进程中使用它,没有任何标志来阻止它阻塞(使用WNOHANG),它将停止父进程直到子进程终止。不过,我有点不确定waitpid()是如何管理这一切的。waitpid()还返回pid_tpid_t waitpid()返回的值是多少?这取决于父进程或子进程是否调用它,以及子进程是否仍在运行,或是否已终止。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2018-03-23 23:15:58

您对getpid的理解是正确的,它返回运行过程的PID。

waitpid用于阻止进程的执行(除非传递WNOHANG ),并在进程(或更多的)子进程结束时恢复执行。waitpid返回状态已更改的子级的pid,失败时返回-1。如果WNOHANG指定了状态,但子节点没有更改状态,它也可以返回0。请参见:

男侍者 返回值 WNOHANGwaitpid():在成功时,返回状态已更改的子进程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()是如何处理这一切的

waitpid是一个syscall,操作系统负责处理这个问题。

  • 这取决于父进程或子进程是否调用它,以及子进程是否仍在运行,或是否已终止。

wait只应由已执行fork()的进程调用。因此父进程应该是cal wait()/waitpid。如果子进程没有调用fork(),那么它就不需要调用这些函数中的任何一个。但是,如果子进程调用了fork(),那么它也应该调用wait()/waitpid()

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

票数 5
EN

Stack Overflow用户

发布于 2018-03-23 23:09:07

waitpid“只能返回子进程的状态”(从POSIX规范)。因此,pid_t等待返回属于调用waitpid的进程的当前或以前的子进程之一。例如,如果一个子节点最近终止了,它将返回该子节点的PID。

只有从父进程调用waitpid才有用。如果从没有任何子进程的进程调用,则返回ECHILD

waitpid可以检查已终止或最近停止或继续的子程序的状态(例如,^Z从shell)。规范中的各种pid/选项参数组合告诉您可以返回的各种类型的信息。例如,WCONTINUED选项请求最近连续的子级而不是最近终止的子级的状态。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/49459392

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档