新聞中心

        EEPW首頁 > 嵌入式系統 > 設計應用 > 進程控制開發之:Linux進程控制編程

        進程控制開發之:Linux進程控制編程

        作者: 時間:2013-09-13 來源:網絡 收藏

        本文引用地址:http://www.104case.com/article/257131.htm

        7.2編程

        1.()

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

        (1)fork()函數說明。

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

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

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

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

        (2)fork()函數語法。

        表7.2列出了fork()函數的語法要點。

        表7.2 fork()函數語法要點

        所需頭文件

        #includesys/types.h>//提供類型pid_t的定義
        #includeunistd.h>

        函數原型

        pid_tfork(void)

        函數返回值

        0:子進程

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

        -1:出錯

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

        /*fork.c*/

        #includesys/types.h>

        #includeunistd.h>

        #includestdio.h>

        #includestdlib.h>

        intmain(void)

        {

        pid_tresult;

        /*調用fork()函數*/

        result=fork();

        /*通過result的值來判斷fork()函數的返回情況,首先進行出錯處理*/

        if(result==-1)

        {

        printf(Forkerrorn);

        }

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

        {

        printf(Thereturnedvalueis%dn

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

        }

        else/*返回值大于0代表父進程*/

        {

        printf(Thereturnedvalueis%dn

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

        }

        returnresult;

        }

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

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

        $./fork

        Thereturnedvalueis76/*在父進程中打印的信息*/

        Infatherprocess!!

        MyPIDis75

        Thereturnedvalueis:0/*在子進程中打印的信息*/

        Inchildprocess!!

        MyPIDis76

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

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

        上一頁 1 2 3 4 5 下一頁

        評論


        相關推薦

        技術專區

        關閉
        主站蜘蛛池模板: 晋中市| 诸暨市| 玉门市| 邯郸市| 虹口区| 泾阳县| 昆山市| 舞钢市| 堆龙德庆县| 洪雅县| 三原县| 呼图壁县| 吴桥县| 金门县| 驻马店市| 潮州市| 社旗县| 铜山县| 长海县| 邢台县| 淳化县| 长葛市| 土默特左旗| 和林格尔县| 公安县| 和顺县| 玉门市| 广昌县| 大厂| 孝昌县| 伊宁市| 醴陵市| 阿坝| 金坛市| 龙州县| 西和县| 铜山县| 玛纳斯县| 建湖县| 荥经县| 丰宁|