2021-05-12 14:32:11
Linux 進程管理 詳述
我長期規劃的目標是往底層走,所以我最近一段時間開始分享Linux的一些文章,前期是Linux基本操作,然後是Linux應用開發,最後我還打算研究Linux底層核心,驅動,因為Linux這塊我也是初學者,所以在分享文章的時候,可能有些人會覺得比較淺,我在剛剛開始寫文章的時候就說了,目的一方面是分享給大家,另外一方面算是自己的一個筆記,整理出來,加深理解,所以最近的文章或者接下來的文章,可能有些內容比較基礎或不夠全面,也請見諒。。。
好了,花了一個週末研究了下Linux 進程管理,今天就來簡單談談:
我們先用ps -ef檢視下進程
PID就是進程ID,PPID是父進程ID
/sbin/init是1號進程,我們可以看到ps -ef 的進程ID是2090,父進程ID是1960
1960號進程是-bash,也就是我們的shell,它的父進程是1956
1956號進程是 sshd:root@pts/0,也就是我們的遠端終端,它的父進程是1516,/usr/sbin/sshd是一個sshd的服務,1516號進程的父進程是1 init
我們可以在程式中來檢視當前進程的pid和ppid
我們用scanf等待輸入,防止進程死掉
那麼我們的進程在核心中是如何執行的呢
其實核心的執行也是需要操作記憶體,但是每個進程又是獨立的,這就需要虛擬記憶體來實現,每個進程有自己的虛擬記憶體,裡面儲存了程式碼區,堆,共用庫,棧,環境變數,命令列引數,核心地址空間等等,然後通過時間片的方式真正操作記憶體
就好像一個正在讀取的磁碟一樣,一直在轉,輪詢到自己的時候,就真正操作記憶體來執行,其他時間就等待。
所以Linux進程執行是多工,分時執行的,看上去好像是同時執行,其實是輪著執行
我們可以通過fork函數建立一個進程
執行結果:
我們可以看到父進行和子進程都執行了
fork的過程就是父進程把自己的虛擬記憶體中存的東西,拷貝一份直接給子進程,然後接下來的執行過程分為兩個分支,父進程和子進程同時執行,執行的先後順序不確定。
我們對上面的程式碼稍微修改下:
執行結果:
我們可以看到count的結果都是1,代表父進程和子進程是分開執行的,並且互不影響
我們來看下面一個程式:
執行結果:
總共有8個進程了,這個分裂的過程是怎麼回事呢
第一次fork
第二次fork
第三次fork
下面我們來談一下vfork
vfork是與父進程共用地址空間,並且父進程會等子進程執行完畢,才執行,子進行有自己的pid
看例子:
執行結果:
由於子進程是和父進程共用記憶體地址空間,所以子進程執行完,父執行再執行的時候,count=2了
進程的等待就是wait函數,進程的銷毀就是exit函數,這個沒什麼好說的
下面看下執行檔案exec族
就是用來執行檔案的,下面我們舉兩個例子
後面的引數要從命理開始,最後以NULL結尾
執行結果:
執行結果跟上面一樣的,其他函數,讀者自己寫下,執行下就行了
下面來看看守護行程Daemon
守護行程是脫離終端,在後台執行的進程,不會因為終端關閉而關閉
建立守護進行一般是如下幾個步驟
1 建立子進行,退出父進程
2 建立新的對談,來脫離終端
3 關閉所有的檔案描述符
4 改變工作目錄為根目錄
5 umask重設許可權掩碼
6 具體事件
我們來看一個例子
執行
ps -ef
我們看到./mydaemon的進程的父進程是1了
再來看看是否一直在往檔案中寫內容
如果想殺死這個進程,用kill 進程號即可
再看
我們的守護行程被殺死了
好了,Linux進程管理就總結到這裡,如有問題,歡迎指正,謝謝。
本文永久更新連結地址:http://www.linuxidc.com/Linux/2016-11/137617.htm
相關文章