網(wǎng)站一屏做多大網(wǎng)址域名注冊
查看進程指令proc/ps
注意哦, 我們經(jīng)常使用的指令, 像ls, touch…這些指令在啟動之后本質(zhì)上也是進程
proc 是內(nèi)存文件系統(tǒng), 存放著當前系統(tǒng)的實時進程信息. 每一個進程在系統(tǒng)中, 都會存在一個唯一的標識符(pid -> process id), 就如同學生在學校里有一個專門的學號一樣.
大多數(shù)進程信息同樣可以使用top和ps這些用戶級工具來獲取
ps命令 用于報告當前系統(tǒng)的進程狀態(tài)??梢源钆鋕ill指令隨時中斷、刪除不必要的程序。
ps的選項
**head -1 **只輸出第一行
grep -v命令
kill進程終止
kill -9是殺死進程的終極武器。一般情況下慎用,以防產(chǎn)生什么系統(tǒng)故障或者影響軟件的再運行環(huán)境。
獲取子ID(getpid)
從運行結(jié)果可以看出,我們的子類進程的ip只要一結(jié)束重寫運行ip就會變,但是父類ip不會變,父類不變說明命令行所有指令都是bash的子進程
創(chuàng)建子進程(系統(tǒng)調(diào)用創(chuàng)建進程 fork)
fork()如果成功了返回值為子進程的id并且0返回給子進程,如果失敗了返回-1給父類,沒有子進程創(chuàng)建
問題1:為什么fork要給子進程返回0,給父進程返回子類的id呢?
他們賦值不同是為了區(qū)分不同的執(zhí)行流,執(zhí)行不同的代碼,一般而言fork之后的代碼都是父子共享。
這是因為后期父類會對子類進行修改,所以我們需要提前保存子類的id,而子類可以通過getpid函數(shù)來得到父類的id,所以只需要賦值0標記創(chuàng)建成功即可
問題2:一個函數(shù)是如何做到返回兩次的?
在我們fork后,同一個程序會執(zhí)行兩次,這是因為新建的子類和父類的代碼時共用的且不可被修改。除非我們做一下判斷返回值的選項來分別輸出
那么我們?yōu)槭裁匆獎?chuàng)建子進程呢?
這是因為我們不想讓父和子做同樣的事情,需要想辦法分開輸入,所以我們就從frok()的返回值下手
那么是如何做到返回兩次的呢?這是因為fork是一個函數(shù),它內(nèi)部對馬上要進行的子進程進行了一些包裹,最后我們return的時候會返回兩次,這是因為return語句是父和子共享的,所以就會出現(xiàn)兩個結(jié)果,輸出兩次
問題3:一個變量怎么會有不同的內(nèi)容?
當fork了一個子進程后,如果子進程沒有新的成員或者函數(shù)方法,并且也沒有對父類進行修改,則這是它和父類是共用的同一空間和代碼區(qū)。
當他重寫了父類的方法或者自己新建了函數(shù)、變量,則這是系統(tǒng)會為他新建一塊空間,這是我們叫寫時拷貝
當fork執(zhí)行成功后,如果父子進程被創(chuàng)建好,誰先運行是由調(diào)度器來決定的。