> 文章列表 > Linux 进程:辨析wait与waitpid

Linux 进程:辨析wait与waitpid

Linux 进程:辨析wait与waitpid

目录

    • 一、wait
    • 二、waitpid

  waitwaitpid 这两个函数的作用是:等待子进程退出,在子进程退出后释放子进程资源,防止子进程变成僵尸进程。但准确的说,它们的作用是:处理已经退出的子进程,并获取子进程的退出返回值

 来举个例子:如果wait或者waitpid函数是在程序运行的第10秒才会被执行到,但是在程序运行的第5秒就已经有子进程A退出了,你觉得当运行到wait或者waitpid函数的时候,会去处理子进程A吗?

 答案是会的,因为准确的说它们的功能就是:处理已经退出的子进程,并获取子进程的退出返回值。

一、wait

pid_t wait(int *status);

 作用:如果调用时还没有已经退出的子进程,那么将阻塞等待任意一个子进程退出

  • int *status:使用status参数作为输出参数获取子进程的退出返回值。

 返回值:如果成功处理退出的子进程就返回子进程的pid,失败返回-1。

 注意:因为这个函数是一种阻塞等待,当阻塞被打断时,意味着这个函数处理失败。

二、waitpid

pid_t waitpid(pid_t pid, int *status, int options);

 作用:处理退出的子进程,但根据操作选项options的不同,也会分为不同的情况。

(1)参数:pid

pid 含义
-1 等待任意一个子进程
子进程pid 等待该子进程

 pid这个参数常用的两个选项:

  • -1:代表着等待任意一个子进程退出,然后进行处理。
  • 子进程pid:专门去等待这个pid对应的子进程退出,然后进行处理。

(2)参数:status

  • int *status:输出参数,用于向外界返回退出子进程的返回值。

(3)参数:options

options 含义
WNOHANG 如果运行这个函数时子进程没有退出,直接返回,不等待。

  我们常用的就是这个选项:WNOHANG,表示当这个函数运行时如果没有子进程已经退出,就直接返回,并不阻塞等待。

(4)返回值

  返回值共三种:

  • 如果成功处理了退出的子进程:返回子进程pid
  • 如果当前没有子进程退出:返回0
  • 如果处理出错:返回-1