正确理解waitpid()和getpid()

时间:2018-03-23 23:02:21

标签: c unix pid waitpid

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

getpid()将返回任何进程调用它的进程ID。如果父进程调用它,它将返回父进程的pid。同样适合孩子。 (根据联机帮助页,它实际上返回了pid_t类型的值。

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

2 个答案:

答案 0 :(得分:3)

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

使用

waitpid(如你所说)来阻止进程的执行(除非 传递WNOHANG并在进程的(或更多)子进程时继续执行 结束。 waitpid返回状态已更改的子项的pid,-1 失败。如果指定了WNOHANG但是孩子没有指定,它也可以返回0 改变了状态。参见:

  

man waitpid

     

返回值

     

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

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

  

man waitpid

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:如果没有孩子退出,请立即返回。
  •   如果孩子已经停止(但没有通过ptrace(2)跟踪),
  • WUNTRACED也会返回。   即使未指定此选项,也会提供已停止的已跟踪子项的状态。
  •   
  • WCONTINUED(自Linux 2.6.10起)如果已通过递送SIGCONT恢复已停止的孩子,也会返回。
  •   
  •   

    我有点不确定waitpid()如何管理所有这些

waitpid是系统调用,操作系统处理此问题。

  •   

    这取决于父母或孩子是否调用它,以及子进程是否仍在运行或已终止,这会如何变化?

wait只应由已执行fork()的进程调用。所以父母 流程应该是wait() / waitpid。如果子进程没有被调用 fork(),然后它不需要调用这些函数中的任何一个。但是如果 子进程调用了fork(),然后它也应该调用 wait() / waitpid()

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

答案 1 :(得分:2)

waitpid&#34;只返回子进程的状态&#34; (来自POSIX spec)。因此,pid_t waitpid返回属于调用waitpid的进程的当前或以前的子级之一。例如,如果孩子最近终止,则返回该孩子的PID。

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

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