进程控制---wait 和 waitpid 函数详解

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了进程控制---wait 和 waitpid 函数详解相关的知识,希望对你有一定的参考价值。

进程的终止可以分为异常终止和正常终止。
  • 当进程是正常终止的时候,子进程会通过 exit 函数向父进程传递终止状态;
  • 当进程是异常终止的时候,内核(而不是进程)会传递给父进程一个信号编号值。
所以说无论子进程是正常终止还是异常终止,父进程都可以通过 wait 或者 waitpid 函数来获取到子进程的终止状态,通过参数 status。
无论子进程是正常终止还是异常终止 或者 子进程暂停了,内核都会向父进程发送一个 SIGCHLD 信号,但是父进程对于此信号的默认动作是忽略。当然我们也可以捕捉该信号。
=====================================================
函数原型:
技术分享
技术分享
函数参数:
  • status:指向用来保存子进程终止状态的指针。
返回值:
  • 调用成功时返回 终止的子进程的 ID 号
  • 调用失败时返回 -1 ,当父进程没有子进程的时候调用会出错
  父进程中可以使用 wait 函数来等待子进程终止,如果子进程没有终止,那么父进程将会阻塞;父进程可以有多个子进程,但是 wait 函数在一个子进程终止后便会立即返回,并通过status来获取子进程终止的状态值。如果不关心子进程的终止状态,则可以传递 NULL。
  注意只有子进程终止的时候 wait 函数才返回,比如子进程由运行态转为暂停态 wait 函数不会返回,父进程仍然阻塞。
=====================================================
函数原型:
技术分享
技术分享
函数参数:
  • pid:用来决定等待哪些子进程
  • status:指向用来保存子进程终止状态的指针
  • options:一些可设置的选项,如设置为 非阻塞
返回值:
  • 调用成功时返回终止的子进程的进程 ID,
  • 调用失败时返回 -1
  • 当 options 设置成 WNOHANG 的时候,如果没有子进程终止,那么立即返回 0

 

waitpid 函数的功能比 wait 函数的功能要强大的多,下面详细分析:
参数 pid 的含义,wait 函数会等待所有子进程,而 waitpid 函数可以通过 pid 函数来指定等待的子进程,pid 可以有以下几种值:
  • pid = -1:代表 等待所有的子进程,和 wait 函数作用相同
  • pid < -1:代表 等待所有 进程组号 和 pid 绝对值相等的子进程
  • pid = 0:代表 等待 进程组号 和 调用进程 ID 相等的子进程
  • pid > 0:代表 等待 进程ID 等于 pid 的子进程
参数 options 可以设置为 0 或者 WNOHANG、WUNTRACED两个宏的组合(使用 位或运算符)。通常使用的就是 0 和 WNOHANG。
  • WNOHANG:代表 当没有子进程终止的时候,waitpid 函数并不会阻塞,而是立即返回。不设置的话,默认 waitpid 函数是会阻塞的。
调用出错情况:
  • wait 函数只会在一种情况下才会调用出错,也就是 调用进程没有子进程的时候。
  • waitpid 函数的出错情况比 wait 函数要多一点,比如指定的进程组不是调用进程的子进程,则会出错;当没有子进程的时候也会出错

以上是关于进程控制---wait 和 waitpid 函数详解的主要内容,如果未能解决你的问题,请参考以下文章

wait()函数和waitpid()函数详解

函数wait和waitpid

wait,waitpid学习测试

详解wait和waitpid函数

linux 进程等待 wait waitpid

进程控制---子进程终止状态相关的宏