进程控制---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 函数详解的主要内容,如果未能解决你的问题,请参考以下文章