歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux 進程管理 詳述

Linux 進程管理 詳述

日期:2017/2/28 13:46:32   编辑: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進程管理就總結到這裡,如有問題,歡迎指正,謝謝。

Copyright © Linux教程網 All Rights Reserved