Linux :进程
1、進(jìn)程的相關(guān)概念?
?
?ps -aux看到的太多了? 我們想查的精確一點(diǎn)
?ps -aux|grep init(所有帶init的)
?top: 別人看cpu的占用率 用 top
?
可以看到我們的這個(gè)進(jìn)程的pid 以及cpu的占用率
?
?
?
?
2、創(chuàng)建進(jìn)程函數(shù)fork 的使用
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 他的返回值是pid_t?
?
? ? ? ? ? ? ? ? 同一個(gè)程序每一次的pid都是不一樣的?
接著我們只是加一個(gè)fork
? ? ? ? ? ? ? ? ? ? ??發(fā)現(xiàn)出來(lái)了兩個(gè)結(jié)果,猜測(cè):fork 以后創(chuàng)建了新進(jìn)程
為了證明猜測(cè),如下操作
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?得出來(lái)的結(jié)果如下
? ? ? ? ?
? ? ? ? ?再猜測(cè):fork()以后父子進(jìn)程都會(huì)運(yùn)行的,只是pid 不同
因?yàn)樾逻M(jìn)程的id 號(hào)肯定和原來(lái)的id號(hào)不一樣
結(jié)果
都一樣的
?
?結(jié)果
pid跟原來(lái)相等的話是父進(jìn)程? 不相等的話是子進(jìn)程
?
這步 確定fork ()以后還有父進(jìn)程在走
?
?
?這步看看fork()大于0 是不是父進(jìn)程
?
fork()返回值大于0 進(jìn)入了父進(jìn)程。并且大于0的數(shù)剛好等于子進(jìn)程的id 號(hào)
?
?(以前的Linux是拷貝全部的 ,現(xiàn)在linux是寫時(shí)拷貝? ?,不改動(dòng)的地方直接共享)
3、fork的總結(jié)
?
這是第一個(gè)應(yīng)用場(chǎng)景
不滿足條件不創(chuàng)建任何進(jìn)程
?
想看看里面創(chuàng)建的具體的ip地址,改動(dòng)如下
?
ps -aux能看到現(xiàn)在幾個(gè)進(jìn)程再運(yùn)行
4、vfork
?先來(lái)fork的
?父子進(jìn)程都會(huì)執(zhí)行,誰(shuí)先執(zhí)行取決于進(jìn)程的調(diào)度
那么vfork 呢?
?
?一直是子進(jìn)程在運(yùn)行
稍微改動(dòng)一下
讓子進(jìn)程運(yùn)行三遍就讓父進(jìn)程運(yùn)行?
? ? ? ? ? ? ? ? ? ? ? ? 然后我們可以打印一下變量
?
?子進(jìn)程退出的時(shí)候要用好的方式退出,否則變量會(huì)被破壞掉
5、進(jìn)程退出
?
?
?推薦用exit ,exit 是對(duì)_exit 和_Exit 的分裝。
exit 會(huì)把進(jìn)程運(yùn)行的變量(緩沖區(qū)的變量)進(jìn)行處理再退出。其他兩個(gè)是直接退出
?
?
?這兩個(gè)_exit 和_Exit運(yùn)行完結(jié)果都是對(duì)的?
?但是break? 可不是對(duì)的哦,破壞了變量的值
6、父進(jìn)程等待子進(jìn)程退出
?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 代碼不用改 ,直接copy 看一眼
S+表示正在運(yùn)行的狀態(tài)
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? Z+就是僵尸進(jìn)程
那我們把vfork 換成fork呢
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?運(yùn)行結(jié)果如下
????????????????????????????????????????
?還是有僵尸進(jìn)程,這是因?yàn)槲覀儧]對(duì)子進(jìn)程的退出狀態(tài)收集,所以他們會(huì)變成僵尸進(jìn)程
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ?這是需要用到的函數(shù)(? 一般用前兩個(gè))
(里面的ppt 改成wait 使調(diào)用者阻塞)?
?
?
?
?
因?yàn)閟tatus 參數(shù)是空的話,不關(guān)心退出狀態(tài) 。我們先來(lái)個(gè)空的試試,先用wait函數(shù)的。
?
3538沒掉了,就不會(huì)變成僵尸進(jìn)程,因?yàn)橹拔覀儧]對(duì)子進(jìn)程的退出狀態(tài)收集,所以他們會(huì)變成僵尸進(jìn)程,所以調(diào)用wait 防止子進(jìn)程變成僵尸進(jìn)程
那么退出的status 的值是多少呢?我們要用到那個(gè)非空
非空: 子進(jìn)程退出狀態(tài)放在它所指向的地址中
不僅要等待子進(jìn)程退出,還要檢查她的退出狀態(tài)。
假設(shè)退出的狀態(tài)默認(rèn)為10?
? ? ?wait 記得取地址
假設(shè)子進(jìn)程退出的時(shí)候,讓他的退出碼為3
?
?status 的值有點(diǎn)怪怪的,跟我們要的3 對(duì)不上
我們?cè)趺礃硬拍馨?真正的檢測(cè)出來(lái)?
? ? ? ? ? ? ? ? ? ? ? ? ? ? ? ? 因?yàn)槲覀兊淖舆M(jìn)程現(xiàn)在是正常退出? ? ?
? ? ? ? ? ? ? ? ? ? ? ? ?需要用到這個(gè)宏解析他
?
改動(dòng)一下
?
?這時(shí)候真正的結(jié)果子進(jìn)程退出的狀態(tài)碼是3
(里面的ppt 改成wait 使調(diào)用者阻塞)?
options這個(gè)選項(xiàng)讓等待子進(jìn)程退yong出的時(shí)候 ,父進(jìn)程不堵塞
?
?用的最多的是第二個(gè)? 不堵塞
?
第一個(gè)參數(shù)Pid一般也有四個(gè)取值?,一般用的最多的是第二個(gè)
?
?
?
父子進(jìn)程一起走
?雖然父進(jìn)程有調(diào)用子進(jìn)程的waitpid,但是父進(jìn)程馬上就打印了 父進(jìn)程不等待子進(jìn)程退出
?
孤兒進(jìn)程的代碼如下:
???????
?
補(bǔ)充:
?
?
?
?
?
總結(jié)
- 上一篇: 花呗要求全额还款怎么办
- 下一篇: linux:exec族函数, exec族