<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>

新聞中心

EEPW首頁(yè) > 嵌入式系統 > 設計應用 > 進(jìn)程控制開(kāi)發(fā)之:Linux進(jìn)程控制編程

進(jìn)程控制開(kāi)發(fā)之:Linux進(jìn)程控制編程

作者: 時(shí)間:2013-09-13 來(lái)源:網(wǎng)絡(luò ) 收藏

本文引用地址:http://dyxdggzs.com/article/257131.htm

7.2編程

1.()

中創(chuàng )建一個(gè)新進(jìn)程的惟一方法是使用()。()中一個(gè)非常重要的,和讀者以往遇到的函數有一些區別,因為它看起來(lái)執行一次卻返回兩個(gè)值。難道一個(gè)函數真的能返回兩個(gè)值嗎?希望讀者能認真地學(xué)習這一部分的內容。

(1)fork()函數說(shuō)明。

fork()函數用于從已存在的進(jìn)程中創(chuàng )建一個(gè)新進(jìn)程。新進(jìn)程稱(chēng)為子進(jìn)程,而原進(jìn)程稱(chēng)為父進(jìn)程。使用fork()函數得到的子進(jìn)程是父進(jìn)程的一個(gè)復制品,它從父進(jìn)程處繼承了整個(gè)進(jìn)程的地址空間,包括進(jìn)程上下文、代碼段、進(jìn)程堆棧、內存信息、打開(kāi)的文件描述符、信號控制設定、進(jìn)程優(yōu)先級、進(jìn)程組號、當前工作目錄、根目錄、資源限制和控制終端等,而子進(jìn)程所獨有的只有它的進(jìn)程號、資源使用和計時(shí)器等。

因為子進(jìn)程幾乎是父進(jìn)程的完全復制,所以父子兩個(gè)進(jìn)程會(huì )運行同一個(gè)程序。因此需要用一種方式來(lái)區分它們,并使它們照此運行,否則,這兩個(gè)進(jìn)程不可能做不同的事。

實(shí)際上是在父進(jìn)程中執行fork()函數時(shí),父進(jìn)程會(huì )復制出一個(gè)子進(jìn)程,而且父子進(jìn)程的代碼從fork()函數的返回開(kāi)始分別在兩個(gè)地址空間中同時(shí)運行。從而兩個(gè)進(jìn)程分別獲得其所屬fork()的返回值,其中在父進(jìn)程中的返回值是子進(jìn)程的進(jìn)程號,而在子進(jìn)程中返回0。因此,可以通過(guò)返回值來(lái)判定該進(jìn)程是父進(jìn)程還是子進(jìn)程。

同時(shí)可以看出,使用fork()函數的代價(jià)是很大的,它復制了父進(jìn)程中的代碼段、數據段和堆棧段里的大部分內容,使得fork()函數的系統開(kāi)銷(xiāo)比較大,而且執行速度也不是很快。

(2)fork()函數語(yǔ)法。

表7.2列出了fork()函數的語(yǔ)法要點(diǎn)。

表7.2 fork()函數語(yǔ)法要點(diǎn)

所需頭文件

#includesys/types.h>//提供類(lèi)型pid_t的定義
#includeunistd.h>

函數原型

pid_tfork(void)

函數返回值

0:子進(jìn)程

子進(jìn)程ID(大于0的整數):父進(jìn)程

-1:出錯

(3)fork()函數使用實(shí)例。

/*fork.c*/

#includesys/types.h>

#includeunistd.h>

#includestdio.h>

#includestdlib.h>

intmain(void)

{

pid_tresult;

/*調用fork()函數*/

result=fork();

/*通過(guò)result的值來(lái)判斷fork()函數的返回情況,首先進(jìn)行出錯處理*/

if(result==-1)

{

printf(Forkerrorn);

}

elseif(result==0)/*返回值為0代表子進(jìn)程*/

{

printf(Thereturnedvalueis%dn

Inchildprocess!!nMyPIDis%dn,result,getpid());

}

else/*返回值大于0代表父進(jìn)程*/

{

printf(Thereturnedvalueis%dn

Infatherprocess!!nMyPIDis%dn,result,getpid());

}

returnresult;

}

將可執行程序下載到目標板上,運行結果如下所示:

$arm-linux-gccfork.c–ofork(或者修改Makefile)

$./fork

Thereturnedvalueis76/*在父進(jìn)程中打印的信息*/

Infatherprocess!!

MyPIDis75

Thereturnedvalueis:0/*在子進(jìn)程中打印的信息*/

Inchildprocess!!

MyPIDis76

從該實(shí)例中可以看出,使用fork()函數新建了一個(gè)子進(jìn)程,其中的父進(jìn)程返回子進(jìn)程的PID,而子進(jìn)程的返回值為0。

linux操作系統文章專(zhuān)題:linux操作系統詳解(linux不再難懂)

上一頁(yè) 1 2 3 4 5 下一頁(yè)

評論


相關(guān)推薦

技術(shù)專(zhuān)區

關(guān)閉
国产精品自在自线亚洲|国产精品无圣光一区二区|国产日产欧洲无码视频|久久久一本精品99久久K精品66|欧美人与动牲交片免费播放
<dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><small id="yhprb"></small><dfn id="yhprb"></dfn><small id="yhprb"><delect id="yhprb"></delect></small><small id="yhprb"></small><small id="yhprb"></small> <delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"></dfn><dfn id="yhprb"></dfn><s id="yhprb"><noframes id="yhprb"><small id="yhprb"><dfn id="yhprb"></dfn></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><small id="yhprb"></small><dfn id="yhprb"><delect id="yhprb"></delect></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn> <small id="yhprb"></small><delect id="yhprb"><strike id="yhprb"></strike></delect><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn><dfn id="yhprb"><s id="yhprb"><strike id="yhprb"></strike></s></dfn><dfn id="yhprb"><s id="yhprb"></s></dfn>