linu學習筆記-父進程與子進程的關系(通俗理解)


父進程和子進程

子進程是父進程的復制品

Unix/linux系統中的進程創建是這樣的,理解起來有點繞。

父進程先執行fork()系統調用,這個調用的結果是系統中多出了一個跟父進程內容完全一樣的進程,這個新進程被稱為子進程,當然該進程的PCB中父進程指針是指向第一個進程的。

前后兩個進程各自有自己的地址空間,形式上有點像把一個文件拷貝了一個副本。雖然資源也相互獨立,但拷貝時父進程執行過程已生成的數據,子進程也拷了一份。說簡單點像一個執行到半路的程序突然在系統中多出了一個孿生兄弟,什么都跟自己一樣,但要管自己叫老爸。

當然這樣的簡單復制本身是沒什么用處的。要讓它發揮作用,還需要再執行 exec(B )系統調用,這個調用可以讓當前進程轉而執行另一個可執行代碼(一個新的程序)。簡單的說進程本來在執行A程序,一旦執行到這個調用,就轉而開始執行B程序。

至此,父子兩進程就變的不一樣了,但不管它們各自執行的什么代碼,其父子關系不會改變,在父進程中可以使用子進程的進程ID(在執行fork()時的返回值中得到)來中止子進程的執行。當然子進程也可以因為自己的執行程序結束而終止執行

 

 

父進程和子進程先后執行的問題,是這樣的,在fork之后,是父進程先執行,然后一個時間片到達之后就是子進程再執行了。

 

每一個子進程都有一個父進程,當進程終止或者結束的時候,都會給父進程發送一個SIGCHLD信號,系統默認是父進程忽略這個信號,如果父進程希望被告知其子進程的這種狀態改變,則應該捕獲這個信號,捕捉函數一般是wait函數來取得子進程ID和子進程狀態。

 

對於鍵盤上的Ctrl+按鍵的操作,一般是產生一個信號,然后進程捕捉這個信號。另外當然我們可以直接使用這些信號,通過kill命令,把信號發給相應的其他進程。

 

wait函數是父進程等待子進程結束,也就是說當子進程結束的時候會發送給父進程一個信號SIGCHID,這時候父進程通過wait函數接收到這個信號,這時候父進程就知道子進程結束了。這個正好用在shell解析器的編寫里面,shell解析器作為父進程,而命令行命令作為子進程,當子進程結束的時候就會告訴父進程,這時候父進程就可以提示輸入下一個命令了。

 

一個進程只能為他自己或者他的子進程設置進程組ID,在他的子進程調用了exec函數之后,就不能再改變該子進程的進程組ID了。

 

 

Linux進程管理對於電腦使用的玩家的常用軟件,然后我就學習及深入的研究Linux進程管理,在這里和大家一起探討Linux進程管理的使用方法,希望對大家有用。程序是為了完成某種任務而設計的軟件,比如OpenOffice是程序。

  什么是進程呢?進程就是運行中的程序。一個運行着的程序,可能有多個進程。比如LinuxSir.Org 所用的WWW服務器是apache服務器,當管理員啟動服務后,可能會有好多人來訪問,也就是說許多用戶來同時請求httpd服務,apache服務器將會創建有多個httpd進程來對其進行服務。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM