深刻理解fork呼叫

2021-08-20 06:05:50 字數 1403 閱讀 8510

fork()是linux中的系統呼叫函式,用於建立程序,建立失敗返回-1,建立成功會返回兩次(不是返回了兩個值,而是返回了兩次)。需要注意的是fork呼叫一次返回兩次:對父程序而言它返回的是子程序的id,對子程序而言它返回0。

子程序是父程序的副本,它將獲得父程序資料空間、堆、棧等資源的副本。注意,子程序持有的是上述儲存空間的「副本」,這意味著父子程序間不共享這些儲存空間。

#include#include#include// 系統呼叫的封裝

#include//wait/waitpid時使用

int main()

else if(p1id==0)

//建立第二個程序

pid_t p2id=fork();

printf("第二次%d\n",(int)p2id);

if(p2id<0)

else if(p2id==0)

return 0; }

waitpid(p1id,null,0);

waitpid(p2id,null,0);

printf("這是父程序,父程序id為:%d\n",getpid());

return 0;

執行上述**結果如下:

可見,第一次建立返回兩次,一次是6433,恰好對應其子程序的id;一次是0,即在子程序中的反回0,if(p1id==0)部分對應子程序1的內容。

第二次建立同樣返回兩次,一次是6434,恰好對應其子程序的id;一次是0,即在子程序2中返回0,if(pid2==0)部分對應子程序2的內容。  (上面除if(pid==1)和if)(pid==2)的內容外,其他都是父程序的內容)

重複執行以上程式,那四個返回值出現的位置不同,說明父程序與兩個子程序各自執行。但為什麼在上述情況下兩子程序內部的輸出始終是各自連續的??(刪除顯示p1id p2id的語句,兩部分輸出就會是交錯的!!!)可能這和內部時間分配策略有關,其實只要增加迴圈次數,會發現即使不刪除那兩個語句,輸出也會是交錯的。

注意,當將子程序內部的return 改為exit時,能夠按照預期執行;如果刪除return,則部分內容執行次數多餘預期。如下,最後一句執行了四次,子程序2也重複執行了。

原因如下:子程序的結束應該使用exit(),但是在main函式中,使用exit和使用return的表觀效果一樣(實質不同);

至於為什麼沒有使用exit導致重複執行,至今尚步明白!!???

深刻理解IdentityHashMap

新建pojo package test public class cat public string getname public void setname string name public integer getage public void setage integer age public...

深刻理解IdentityHashMap

新建pojo package test public class cat public string getname public void setname string name public integer getage public void setage integer age public...

JS深刻理解補充

對於函式的理解,首先看乙個函式定義 function functiondefined 顯而易見,functiondefined 為函式名字,在js中為指向這個函式體的指標,代表這個函式的指標的變數,並且和原始資料型別一樣儲存在棧中。而functiondefined函式體則儲存在堆中。每當new出乙個...