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)、子進程的最終目的是要獨立的去運行另外的程序。