久久国产成人av_抖音国产毛片_a片网站免费观看_A片无码播放手机在线观看,色五月在线观看,亚洲精品m在线观看,女人自慰的免费网址,悠悠在线观看精品视频,一级日本片免费的,亚洲精品久,国产精品成人久久久久久久

分享

Linux編程基礎(chǔ)——fork()

 昵稱6599669 2011-03-25

Linux編程基礎(chǔ)——fork()

(2009-11-28 17:05:56)

1,、子進(jìn)程對(duì)存儲(chǔ)空間的復(fù)制

(1) 使用文本編輯器輸入源程序

輸入如下源程序:

#include <sys/types.h>

#include <unistd.h>

#include <stdio.h>

int main(void)

{

int x, i;

printf("Input a initial value for i: ");

scanf("%d", &i);

while((x=fork())==-1);//創(chuàng)建一個(gè)子進(jìn)程,,止到創(chuàng)建成功

if(x==0)

{

printf("When child runs, i=%d\n", i);

printf("Input a value in child: ");

scanf("%d", &i);

printf("i=%d\n", i);

}

else

{

wait();

printf("After child runs, in parent, i=%d\n", i);

}

}

(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

(3) 實(shí)際執(zhí)行結(jié)果分析

編譯生成執(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í)行。

2,、父子進(jìn)程執(zhí)行過(guò)程分析

(1) 按照給定框架編程

按照如下程序框架,,完成源程序編寫:

#include <sys/types.h>

#include <unistd.h>

#include <stdio.h>

int main(void)

{

// ①

Int pid=fork();

// ②

if(pid==0)

{

sleep(3);

printf("Child: pid=%d, ppid=%d\n", getpid(), getppid());

}

else

{

printf("Parent: Child=%d, pid=%d, ppid=%d\n", pid, getpid(), getppid());

wait();

printf("After Child ends.\n");

}

printf("In which process?\n"); // ③

}

(2) 預(yù)測(cè)程序的執(zhí)行結(jié)果

閱讀程序,根據(jù)自己的理解,,預(yù)期程序執(zhí)行后的結(jié)果,。

(3) 實(shí)際執(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é)束,。

(4) 修改程序并分析執(zhí)行結(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)

{

sleep(3);

printf("Child: pid=%d, ppid=%d\n", getpid(), getppid());

}

else

{

printf("Parent: Child=%d, pid=%d, ppid=%d\n", pid, getpid(), getppid());

wait();

printf("After Child ends.\n");

}

}

運(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é)束。

(5) 修改程序驗(yàn)證父子進(jìn)程關(guān)系

修改程序,,使父進(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)

{

sleep(3);

printf("Child: pid=%d, ppid=%d\n", getpid(), getppid());

}

else

{

printf("Parent: Child=%d, pid=%d, ppid=%d\n", pid, getpid(), getppid());

printf("After Child ends.\n");

}

}

程序修改:將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é)束。

    本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,,所有內(nèi)容均由用戶發(fā)布,,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式,、誘導(dǎo)購(gòu)買等信息,,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,,請(qǐng)點(diǎn)擊一鍵舉報(bào),。
    轉(zhuǎn)藏 分享 獻(xiàn)花(0

    0條評(píng)論

    發(fā)表

    請(qǐng)遵守用戶 評(píng)論公約

    類似文章 更多