Linux :进程
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一般也有四個取值?,一般用的最多的是第二個
?
?
?
父子進程一起走
?雖然父進程有調用子進程的waitpid,但是父進程馬上就打印了 父進程不等待子進程退出
?
孤兒進程的代碼如下:
???????
?
補充:
?
?
?
?
?
總結
- 上一篇: 花呗要求全额还款怎么办
- 下一篇: mass u盘不支持怎么办 如何解决Ma