1、进程的相关概念
ps -aux看到的太多了 我们想查的精确一点
ps -aux|grep init(所有带init的)
top: 别人看cpu的占用率 用 top
可以看到我们的这个进程的pid 以及cpu的占用率
2、创建进程函数fork 的使用
他的返回值是pid_t
同一个程序每一次的pid都是不一样的
接着我们只是加一个fork
发现出来了两个结果,猜测:fork 以后创建了新进程
为了证明猜测,如下操作
得出来的结果如下
再猜测:fork()以后父子进程都会运行的,只是pid 不同
因为新进程的id 号肯定和原来的id号不一样
结果
都一样的
结果
pid跟原来相等的话是父进程 不相等的话是子进程
这步 确定fork ()以后还有父进程在走
这步看看fork()大于0 是不是父进程
fork()返回值大于0 进入了父进程。并且大于0的数刚好等于子进程的id 号
(以前的Linux是拷贝全部的 ,现在linux是写时拷贝 ,不改动的地方直接共享)
3、fork的总结
这是第一个应用场景
不满足条件不创建任何进程
想看看里面创建的具体的ip地址,改动如下
ps -aux能看到现在几个进程再运行
4、vfork
先来fork的
父子进程都会执行,谁先执行取决于进程的调度
那么vfork 呢?
一直是子进程在运行
稍微改动一下
让子进程运行三遍就让父进程运行
然后我们可以打印一下变量
子进程退出的时候要用好的方式退出,否则变量会被破坏掉
5、进程退出
推荐用exit ,exit 是对_exit 和_Exit 的分装。
exit 会把进程运行的变量(缓冲区的变量)进行处理再退出。其他两个是直接退出
这两个_exit 和_Exit运行完结果都是对的
但是break 可不是对的哦,破坏了变量的值
6、父进程等待子进程退出
代码不用改 ,直接copy 看一眼
S+表示正在运行的状态
Z+就是僵尸进程
那我们把vfork 换成fork呢
运行结果如下
还是有僵尸进程,这是因为我们没对子进程的退出状态收集,所以他们会变成僵尸进程
这是需要用到的函数( 一般用前两个)
(里面的ppt 改成wait 使调用者阻塞)
因为status 参数是空的话,不关心退出状态 。我们先来个空的试试,先用wait函数的。
3538没掉了,就不会变成僵尸进程,因为之前我们没对子进程的退出状态收集,所以他们会变成僵尸进程,所以调用wait 防止子进程变成僵尸进程
那么退出的status 的值是多少呢?我们要用到那个非空
非空: 子进程退出状态放在它所指向的地址中
不仅要等待子进程退出,还要检查她的退出状态。
假设退出的状态默认为10
wait 记得取地址
假设子进程退出的时候,让他的退出码为3
status 的值有点怪怪的,跟我们要的3 对不上
我们怎么样才能把3真正的检测出来?
因为我们的子进程现在是正常退出
需要用到这个宏解析他
改动一下
这时候真正的结果子进程退出的状态码是3
(里面的ppt 改成wait 使调用者阻塞)
options这个选项让等待子进程退yong出的时候 ,父进程不堵塞
用的最多的是第二个 不堵塞
第一个参数Pid一般也有四个取值 ,一般用的最多的是第二个![](https://img-blog.csdnimg.cn/2021082909203333.png?x-oss-process=image/watermark,type_ZHJvaWRzYW5zZmFsbGJhY2s,shadow_50,text_Q1NETiBA5Yaw57OW5p2O5a2QMTIz,size_20,color_FFFFFF,t_70,g_se,x_16)
父子进程一起走
虽然父进程有调用子进程的waitpid,但是父进程马上就打印了 父进程不等待子进程退出
孤儿进程的代码如下:
补充: