當前位置:編程學習大全網 - 編程軟體 - fork()問題

fork()問題

1. 基礎知識:

1)fork函數總是“調用壹次,返回兩次”,在父進程中調用壹次,在父進程和子進程中各返回壹次。fork在子進程中的返回值是0,而在父進程中的返回值則是子進程的id。

2)子進程在創建的時候會復制父進程的當前狀態(PCB信息相同,用戶態代碼和數據也相同)。

3)程序運行的結果基本上是父子進程交替打印,但這也不是壹定的,取決於系統中其它進程的運行情況和內核的調度算法。

2. 第壹個fork:

子進程A被創建,之後從fork函數往下執行與父進程相同的代碼,即後壹個fork和printf會被父進程和子進程A分別執行壹次:

父進程打印的pid1和pid2是兩個子進程的pid,即結果的第壹行:pid1:3411, pid2:3412

子進程A打印的pid1和pid2是這個fork在子進程A中的返回(0)和子進程A中調用fork返回的pid,即結果的第二行:pid1:0, pid2:3413

3. 第二個fork:

這個fork會被父進程和子進程A都執行壹遍。假設子進程B被主進程創建,子進程C被子進程A創建。子進程A也可以說是子進程C的父進程,為了避免混淆,我這裏改叫主進程而不再使用父進程的概念。

子進程B的打印即結果的第三行:pid1:3411, pid2:0。其中,其中,pid1為復制的主進程的數據,pid2為該fork在子進程B中的返回。

子進程C的打印,即結果的最後壹行:pid1:0, pid2:0。其中,pid1為復制的進程A的數據,pid2為該fork在子進程C內部的返回。

不能再多說,寫得太多,我自己都快暈了。

  • 上一篇:黃金cnc是什麽意思
  • 下一篇:HTML CSS裏面為什麽不能用 *{margin:0; padding:0;}?
  • copyright 2024編程學習大全網