Waitpid 函数|学习笔记

简介: 快速学习 Waitpid 函数,“Waitpid 函数”,也是“等”。虽然功能和 “Wait” 相同,但是 “Waitpid” 实现的功能比 “Wait” 实现的功能更多。

开发者学堂课程【物联网开发- Linux 高级程序设计全套视频Waitpid 函数】学习笔记,与课程紧密联系,让用户快速学习知识。

课程地址:https://developer.aliyun.com/learning/course/660/detail/10990


Waitpid 函数

 

内容介绍:

一·功能

二·参数 “pid”

三·参数 “options”

四·返回值


一、功能

比如我们的父进程创建了三个子进程,我们通过 “Wait” 去等,是不能确定等谁的。

但 “Waitpid” 就能精准的等某一个子进程。 “Waitpid” 的返回值肯定成功的话(就是子进程的进程号),失败就是负数的, “Waitpid” 第一个参数是指定你等哪一个子进程。

如果有多个子进程的话,什么子进程的进程号是不是等谁?第二个参数和它是一致的,要保存就定义变量取离值,不想保存子进程就退出状态。

我们最后看第三个参数,一般船龄带阻塞的,

看 “Waitpid” 的功能:“等待子进程终止,如果子进程终止了,在此函数会回收子进程的资源。”

所以说wait的功能第一个是等,第二个是回收子进程的资源,只不过它可以指定等待哪个子进程。然后返回值成功返回子进程的 ID ,见证号码出错返回-1,这个是和 “Wait” 一致的。

 

二、参数 “pid” :

然后注意 “pid” ,正常情况下,我们传用的最多的就是传子进程的进程号是不是大于零的那种情况,如果我们传零进去的话,等的时候,第一个参数传的零,那肯定不是等零号进程,等待同一个进程组当中的任何子进程,那它也是自己的子进程。

如果子进程加入了别的进程组 “Waitpid” 就不会等它了。比如说你传零的话,某一个父进程有三个子进程,其中A进程加入到别的进程组,这个组只剩下B和C二个进程,那你第一个参数如果传零的话,它是等BC?等BB或者C?知道没有a它就不等了,然后等待同一个进程组当中的任何子进程,它相当于没有指定某一个,只是指的和我一个进程组当中的子进程。

如果第一个参数传-1的话,它等待任意子进程,它的功能就和 “wait” 的作用一样。

就指定等任何一个子进程, “Wait” 就没有指定等哪个子进程,如果传一个负数的话,比如你传-100这个参数,那肯定不是等进程号的那个进程,因为进程号都是大于1的,你传一个负100的话,它等待的是指定进程组当中的任何子进程,这个进程组的ID等于 “pid” 的绝对值,是等进程组号为100,而且还是等它自己的子进程。用的最多的就是直接传子进程的进程号。

 

三、参数 “options” :

那最后一个参数 “options” ,第三个参数用的最多的就是传零,就是阻塞父进程,调位 “pid” 时是不带阻塞的,只要子进程不结束,它就一直等,还可以第三个参数可以传 “WNOHANG” 。

如果 “Waitpid” 的第三个参数 “options” 传这个的话,没有任何子进程已经结束,它就立即返回,相当于有子进程已经结束了,直接回收资源往下进行,如果没有子进程结束的话,直接出错往下进行。如果传  “WUNTRACED” 的话,子进程暂停了,则此函数立马返回,并且不理会子进程的结束状态。

子进程其实有种状态叫暂停,经常用于跟踪调试,很少用到。所以说最多的是用的是0。

就停在那等,等到了回收资源,如果不等,这回收资源的话,就用

“WNOHANG” 。

 

四、返回值:

返回值成功返回子进程的进程号,然后出错返回-1,注意:如果设置 “WNOHANG” 的话,并且 “pid” 指定的子进程存在则返回0。

代码,我们可以改一下,第一个参数是在父进程当中 “pid” 的值是子进程的进程号,第二个参数是状态,第三个参数是0,停在这。

5秒钟直接结束,父进程是也拿到子进程的返回值。也打印子进程的进程号。

注意一下,那它可以指定等哪个子进程,子进程的退出状态稍改就可以,这是用的最多的情况。

传子进程的进程号传0就是阻塞,如果不想让它阻塞,进程已经结束了就回收;没结束返回它继续往下进行。

image.gif这是为了 “pid” 的好处,就可以指定进程号等哪一个子进程。

相关文章
|
2月前
【进程控制】超详细讲解wait和waitpid的原理(结合代码)
【进程控制】超详细讲解wait和waitpid的原理(结合代码)
|
Linux
wait() 函数和 waitpid() 函数
wait() 函数和 waitpid() 函数
629 0
wait() 函数和 waitpid() 函数
|
算法 物联网 Linux
创建进程 fork 函数|学习笔记
快速学习创建进程 fork 函数
154 0
创建进程 fork 函数|学习笔记
|
物联网 Linux 开发者
signal 函数1|学习笔记
快速学习 signal 函数1
101 0
signal 函数1|学习笔记
|
物联网 Linux 开发者
signal 函数返回值|学习笔记
快速学习 signal 函数返回值
209 0
signal 函数返回值|学习笔记
|
算法 物联网 Linux
Vfork|学习笔记
快速学习 Vfork
77 0
Vfork|学习笔记
|
物联网 Linux C语言
Execve 函数|学习笔记
快速学习 Execve 函数
154 0
Execve 函数|学习笔记
|
Linux 调度
vfork() 函数
vfork() 函数
55 0