Linux-fork創建子進程


1、為什么要創建子進程

(1)、每一次程序運行都需要一個進程

(2)、多個進程實現宏觀上的並行

2、fork的內部原理

(1)、進程的分裂生長模式。

  如果操作系統需要一個新進程來運行一個程序,那么操作系統會用一個現有的進程來復制生成一個新的進程。

(2)、fork函數調用一次會返回兩次,返回值等於0的就是子進程,而返回值大於0的就是父進程。

(3)、典型的使用fork的方法:使用fork后然后用if判斷返回值,並且返回值大於0時就是父進程,等於0時就是子進程。

(4)、fork的返回值在子進程中等於0,在父進程中等於本次fork創建的子進程的進程ID。

3、關於子進程

(1)、子進程有自己獨立的PCB

(2)、子進程被內核同等調度

4、父子進程對文件的操作

(1)、子進程繼承父進程中打開的文件

  a、父進程先open打開一個文件得到fd,然后在fork創建子進程。之后在父子進程中各自write向fd中寫入內容

  b、測試結論:接續寫。實際上本質原因是父子進程之間的fd對應的文件指針是彼此關聯的(特別像O_APPEND標志后的樣子)

5、父子進程各自獨立打開同一文件實現共享

(1)、父進程open打開1.txt然后寫入,子進程打開1.txt然后寫入,結論是:分別寫。

原因是父子進程分離后才各自打開的1.txt,這個時候兩個進程的PCB已經獨立了,文件表也獨立了,因此2次讀寫是完全獨立的。

(2)、open時使用O_APPEND標志后,實際測試結果表明O_APPEND標志可以把父子進程各自獨立打開的fd的文件指針給關聯起來,實現分別寫。

6、總結:

(1)、父進程在沒有fork之前自己做的事情對子進程有很大影響,但是父進程在fork之后,在自己的if里做的事情就對子進程沒有影響了。本質原因就是因為fork內部實際上已經復制父進程的PCB生成一個新的子進程,並且fork返回時子進程已經完全和父進程脫離並且獨立的被操作系統OS調度執行了。

(2)、子進程的最終目的是要獨立的去運行另外的程序。

 


免責聲明!

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



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