1,、子進(jìn)程對(duì)存儲(chǔ)空間的復(fù)制 輸入如下源程序: #include <sys/types.h> #include <unistd.h> #include <stdio.h> int main(void) { } (2) 預(yù)測(cè)程序的執(zhí)行結(jié)果 閱讀程序,根據(jù)自己的理解,,預(yù)期程序執(zhí)行后的結(jié)果,。 運(yùn)行結(jié)果為: Input a initial value for i:4 When child runs,i=4 Input a value in child:2 i=2; Agter child runs,in parent,i=4 編譯生成執(zhí)行文件,執(zhí)行后記錄結(jié)果,,說(shuō)明與預(yù)期的結(jié)果是否一致,。分析為什么是這樣的結(jié)果。 運(yùn)行結(jié)果為: Input a initial value for i:4 When child runs,i=4 Input a value in child:2 i=2; Agter child runs,in parent,i=4 結(jié)果分析: 父進(jìn)程執(zhí)行,,輸出Input a initial value for i:后IO中斷,,釋放CPU,父進(jìn)程進(jìn)入阻塞狀態(tài),,輸入4完成后,,父進(jìn)程由阻塞狀態(tài),得到CPU后再次進(jìn)入執(zhí)行狀態(tài),。執(zhí)行while((x=fork())==-1);后,,父進(jìn)程創(chuàng)建一子進(jìn)程,子進(jìn)程復(fù)制了父進(jìn)程的資源,,成為獨(dú)立于父進(jìn)程的一個(gè)進(jìn)程,,并且子進(jìn)程的fork()返回值為0,父進(jìn)程的fork()返回值為剛創(chuàng)建的子進(jìn)程號(hào),。系統(tǒng)先運(yùn)行子進(jìn)程,,子進(jìn)程的pid=fork()=0,進(jìn)入if(pid==0)下的分支,,進(jìn)入該分支后,,因出現(xiàn)IO中斷,子進(jìn)程釋放CPU,,進(jìn)入阻塞狀態(tài),,處于就緒狀態(tài)的父進(jìn)程得到CPU繼續(xù)執(zhí)行,因pid=fork()=子進(jìn)程號(hào),,進(jìn)入else分支,,遇到wait()父進(jìn)程釋放CPU讓子進(jìn)程先執(zhí)行完后再執(zhí)行。 按照如下程序框架,,完成源程序編寫: #include <sys/types.h> #include <unistd.h> #include <stdio.h> int main(void) { // ① Int pid=fork(); // ② if(pid==0) { } else { } printf("In which process?\n"); } 閱讀程序,根據(jù)自己的理解,,預(yù)期程序執(zhí)行后的結(jié)果,。 編譯生成執(zhí)行文件,執(zhí)行后記錄結(jié)果,,說(shuō)明與預(yù)期的結(jié)果是否一致,。分析為什么是這樣的結(jié)果。 執(zhí)行結(jié)果: ParentLChild=12842,pid=12841,ppid=12811 Child:pid=12842,ppid=12841 In which process? After Child ends. In which process? 分析: 父進(jìn)程執(zhí)行,,遇到fork()時(shí),,父進(jìn)程創(chuàng)建一子進(jìn)程,子進(jìn)程復(fù)制了父進(jìn)程的資源,,成為獨(dú)立于父進(jìn)程的一個(gè)進(jìn)程,,并且子進(jìn)程的fork()返回值為0,父進(jìn)程的fork()返回值為剛創(chuàng)建的子進(jìn)程號(hào),。系統(tǒng)先運(yùn)行子進(jìn)程,,子進(jìn)程的pid=fork()=0,進(jìn)入if(pid==0)下的分支,,進(jìn)入該分支后,,sleep(3);使子進(jìn)程進(jìn)入睡眠狀態(tài),釋放CPU,此時(shí)處于就緒狀態(tài)的父進(jìn)程得到CPU進(jìn)入執(zhí)行狀態(tài),,pid=fork()=子進(jìn)程號(hào),,父進(jìn)程進(jìn)入else下的分支,輸出子進(jìn)程號(hào)12842,、自身進(jìn)程號(hào)12841,,自身分進(jìn)程號(hào)12811.之后執(zhí)行wait(),父進(jìn)程釋放CPU讓子進(jìn)程先執(zhí)行完,。子進(jìn)程此時(shí)還在睡眠狀態(tài),,輸出屏幕上會(huì)等待一會(huì)兒,即等待子進(jìn)程醒來(lái),,之后輸出子進(jìn)程號(hào)12842,、父進(jìn)程號(hào)12841,最后子進(jìn)程輸出“In which process?”,。子進(jìn)程執(zhí)行完成釋放CPU,,父進(jìn)程獲得CPU繼續(xù)執(zhí)行,輸出“After Child ends.”,然后輸出“In which process?”,父進(jìn)程結(jié)束,。 把程序框架中最后一句輸出語(yǔ)句(位置③處)分別移至位置①和②處,,預(yù)期輸出結(jié)果是什么?實(shí)際執(zhí)行結(jié)果如何,?分析原因,。 #include <sys/types.h> #include <unistd.h> #include <stdio.h> int main(void) { printf("A In which process?\n"); Int pid=fork(); printf("B In which process?\n"); if(pid==0) { } else { } } 運(yùn)行結(jié)果: A In which process? B In which process? Parent:Child=12915,pid=12914,ppid=12811 B In which process? Child:pid=12915,ppid=12914 After Child ends. 分析: 當(dāng)前進(jìn)程執(zhí)行,輸出“A In which process?”,,然后遇到fork(),,父進(jìn)程,即當(dāng)前進(jìn)程,,創(chuàng)建一子進(jìn)程,,子進(jìn)程復(fù)制了父進(jìn)程的資源,成為獨(dú)立于父進(jìn)程的一個(gè)進(jìn)程,,并且子進(jìn)程的fork()返回值為0,,父進(jìn)程的fork()返回值為剛創(chuàng)建的子進(jìn)程號(hào)。系統(tǒng)先運(yùn)行子進(jìn)程,,輸出“B In which process?”,之后子進(jìn)程的pid=fork()=0,,進(jìn)入if(pid==0)下的分支,進(jìn)入該分支后,,sleep(3);使子進(jìn)程進(jìn)入睡眠狀態(tài),,釋放CPU,此時(shí)處于就緒狀態(tài)的父進(jìn)程得到CPU進(jìn)入執(zhí)行狀態(tài),,輸出“B In which process?”pid=fork()=子進(jìn)程號(hào),,父進(jìn)程進(jìn)入else下的分支,輸出子進(jìn)程號(hào)12815、自身進(jìn)程號(hào)12814,,自身分進(jìn)程號(hào)12811.之后執(zhí)行wait(),,父進(jìn)程釋放CPU讓子進(jìn)程先執(zhí)行完。子進(jìn)程此時(shí)還在睡眠狀態(tài),,輸出屏幕上會(huì)等待一會(huì)兒,,即等待子進(jìn)程醒來(lái),之后輸出子進(jìn)程號(hào)12815,、父進(jìn)程號(hào)12841。子進(jìn)程執(zhí)行完成釋放CPU,,父進(jìn)程獲得CPU繼續(xù)執(zhí)行,,輸出“After Child ends.”,父進(jìn)程結(jié)束。 修改程序,,使父進(jìn)程先執(zhí)行完成,,驗(yàn)證子進(jìn)程是否會(huì)一起終止?如果不是,,前后子進(jìn)程的父進(jìn)程號(hào)是否變化,?記錄并分析結(jié)果。 #include <sys/types.h> #include <unistd.h> #include <stdio.h> int main(void) { printf("A In which process?\n"); Int pid=fork(); printf("B In which process?\n"); if(pid==0) { } else { } } 程序修改:將else里的wait();語(yǔ)句去掉,,即可保證父進(jìn)程先于子進(jìn)程執(zhí)行完,。 執(zhí)行結(jié)果: A In which process? B In which process? B In which process? Parent: Child=12924,pid=12923,ppid=12811 After Child ends. [root@localhost root]# Child:pid=12924,ppid=1 分析: 當(dāng)前進(jìn)程執(zhí)行,輸出“A In which process?”,,然后遇到fork(),,父進(jìn)程,即當(dāng)前進(jìn)程,,創(chuàng)建一子進(jìn)程,,子進(jìn)程復(fù)制了父進(jìn)程的資源,成為獨(dú)立于父進(jìn)程的一個(gè)進(jìn)程,,并且子進(jìn)程的fork()返回值為0,,父進(jìn)程的fork()返回值為剛創(chuàng)建的子進(jìn)程號(hào)。系統(tǒng)先運(yùn)行子進(jìn)程,,輸出“B In which process?”,之后子進(jìn)程的pid=fork()=0,,進(jìn)入if(pid==0)下的分支,進(jìn)入該分支后,,sleep(3);使子進(jìn)程進(jìn)入睡眠狀態(tài),,釋放CPU,此時(shí)處于就緒狀態(tài)的父進(jìn)程得到CPU進(jìn)入執(zhí)行狀態(tài),,輸出“B In which process?”pid=fork()=子進(jìn)程號(hào),,父進(jìn)程進(jìn)入else下的分支,輸出子進(jìn)程號(hào)12824、自身進(jìn)程號(hào)12823,,自身分進(jìn)程號(hào)12811.,,然后輸出“After Child ends.”,父進(jìn)程執(zhí)行完,釋放CPU,,并把子進(jìn)程拋給了最底層系統(tǒng)進(jìn)程,,進(jìn)程號(hào)為1。子進(jìn)程此時(shí)還在睡眠狀態(tài),,進(jìn)程號(hào)為1的父進(jìn)程得到CPU后執(zhí)行,,輸出“[root@localhost root]#”,提示用戶輸入命令,,此時(shí)發(fā)生IO中斷,,進(jìn)程號(hào)為1的父進(jìn)程釋放CPU。此時(shí)子進(jìn)程醒來(lái),,之后輸出子進(jìn)程號(hào)12924,、父進(jìn)程號(hào)1。子進(jìn)程執(zhí)行完成釋放CPU,,父進(jìn)程獲得CPU繼續(xù)執(zhí)行,,父進(jìn)程結(jié)束。 |
|
來(lái)自: 昵稱6599669 > 《通信共享內(nèi)存》