PS 本文用於回答我的朋友的問題,請不要舉報我
1、幾個程式在執行?每個程式的第一行語句從哪裡執行?到哪裡結束?每個程式複製時的資料是多少?以及各個程式間的父子關係?
A、父程式的程式碼從第1行執行到16行結束,每次執行時$count++【$count++為右值運算】,執行到16行後結果為3。
B、父程式在執行到6行時,發起一個系統呼叫,等待系統fork一個新的程式【我起個名字叫child1子程式】,第一次執行時$count=1,$i=0,fork之後子程式的程式碼和父程式完全一樣,沒有什麼變化(實在不理解,可以想想複製貼上或是想想github的forking工作流,你fork人家的專案的時候,得到的資料就是人家目前最新的資料,如果說你過幾天再fork資料就變了【假設倉庫的所有者更新了原始碼】)
父程式第一次fork時:
此時$count=1,$i=0,fork之後產生了第一個子程式。我起名為child_1,此時該子程式的程式碼和父程式完全一樣。
然後:
我們繼續看父程式,$pid在父程式中它的值大於0,執行$coun++【右值運算】,然後執行到第14行,第一次for迴圈結束,此時$i=1,$count=2;
父程式第二次fork時:
同理執行fork系統呼叫,產生第二個子程式,我起名為child_2,此時該子程式的資料為$i=1,$count=2;
然後:
繼續看父程式,執行到14行時迴圈結束,$i=2,$count=3;
此時父程式for迴圈完全結束,回到了第15行列印結果$count=3;
child_1子程式的執行工作過程
該子程式佔用的是獨立的儲存空間,複製父程式的資料時$i=0,$count=1,它會從第7行開始執行,自然在本程式中,$pid=0,為什麼?因為該程式目前是先從第7行開始執行的,它不是從第7行前面執行的,$pid自然就為0了,表示是自己,然後執行第10行的else分支,求得$count=10,然後執行到14行,此時第一次for迴圈結束,$i=1,$count=10;
然後:
child_1程式執行第6行執行fork系統呼叫,此時我起名為child_3程式,它複製的資料此時為$i=1,$count=10;
child_1 程式繼續執行,自然滿足$pid>0的條件,此時$count=10+1;然後跑到第14行,$i=2,整個迴圈結束,最終執行15行得到$count=11;
child_2子程式的執行工作過程
此時複製的資料是$i=1,$count=2;,同樣的從7行開始執行可是隻滿足else分支執行$count=2*10;然後執行14行,整個迴圈結束了$i=2,$count=20;
child_3程式的執行工作過程
此時複製的資料為$i=1,$count=10;它的爸爸是child_1程式,同樣的從第7行開始執行嘛,自然滿足else分支$count=100了,此時迴圈結束$i=2;
總結:
父程式分別fork了child_1程式,child_2程式,child_1程式 fork了 child_3程式
程式間關係樹如下
父程式
—-child_1
——–child_3
—-child_2
加上break之後呢???
父程式第一次fork
$i=0;$count=1;此時產生一個子程式,我也起名為child_1【當然了系統會用程式描述符來標識】
此時執行第7行滿足$count=2;然後執行到14行,第一次迴圈結束,此時$i=1;父程式第二次fork
$i=1;$count=2;此時也執行fork系統呼叫,產生了一個child_2子程式,同樣的也只滿足第7行的程式碼,執行$count=3,然後執行14行,整個迴圈結束$i=2;child_1子程式的執行
複製得來的資料為$i=0;$count=1,此時也從7行開始執行,但是也只滿足else分支算得$count=10;然後遇到break整個迴圈結束。child_2子程式的執行
複製得來的資料為$i=1,$count=2,同樣的從第7行開始執行,也只滿足else分支執行求得$count=20;遇到break結束整個迴圈。
程式之間的關係
主程式
—- child_1
—- child_2
本作品採用《CC 協議》,轉載必須註明作者和本文連結