溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

子進(jìn)程創(chuàng)建函數(shù)fork的理解是什么

發(fā)布時(shí)間:2021-10-14 15:21:12 來(lái)源:億速云 閱讀:147 作者:柒染 欄目:編程語(yǔ)言

這期內(nèi)容當(dāng)中小編將會(huì)給大家?guī)?lái)有關(guān)子進(jìn)程創(chuàng)建函數(shù)fork的理解是什么,文章內(nèi)容豐富且以專業(yè)的角度為大家分析和敘述,閱讀完這篇文章希望大家可以有所收獲。

    關(guān)于進(jìn)程控制的描述,對(duì)fork函數(shù)有一定的認(rèn)識(shí),特做此博文,做一記錄。

例程:

/**
 * @file  fork_try.c
 * @brief  
 *
 *
 * @author  Ma Hao (Alex), mahao@hust.edu.cn
 *  
 * @blog  http://blog.csdn.net/sanwu2010
 *  
 * @internal
 *    Created  2013年11月30日
 *    Version: 0.2
 *    Compiler  gcc/g++
 *    Company  Renesas Lab of HUST
 *    Copyright  Copyright (c) 2013, Ma Hao
 *
 * Trust me! The programmer changes the world! Thanks the mum of XiaoPang Ma!
 * =====================================================================================
 */

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>

int main()
{
    pid_t pid;
    int x = 1;

    pid = fork();
    if( pid == 0 )
    {
        printf("child : x=%d\n",++x);
        exit(0);
    }

    printf("parent: x=%d\n",--x);
    exit(0);
}

執(zhí)行結(jié)果:

Fighting!hust_smartcar@:~/work/code$./fork_try
parent: x=0
child : x=2

理解要點(diǎn):

(1)fork函數(shù)調(diào)用一次,返回兩次

    fork函數(shù)被父進(jìn)程調(diào)用一次,但是卻返回了兩次,一次返回在父進(jìn)程中,返回結(jié)果是子進(jìn)程的PID值,一次返回到子進(jìn)程中,返回結(jié)果是0

  (2)子進(jìn)程和父進(jìn)程并發(fā)執(zhí)行,內(nèi)核以任意的方式交替執(zhí)行它們的邏輯控制流中的指令。無(wú)法對(duì)不同進(jìn)程中指令的交替執(zhí)行做任何假設(shè)。

(3)子進(jìn)程和父進(jìn)程擁有相同的地址空間,相同的用戶棧,相同的全局變量值,相同的代碼段,因?yàn)樽舆M(jìn)程得到了父進(jìn)程用戶級(jí)虛擬地址空間相同的一份拷貝,但是而這確實(shí)相互獨(dú)立的,擁有自己私有地址空間。所以在程序中x的值對(duì)子進(jìn)程和父進(jìn)程而言是相互獨(dú)立的,不受影響的。

(4)子進(jìn)程獲得了與父進(jìn)程任何打開的文件描述符相同的拷貝,所以對(duì)本例而言,子進(jìn)程也獲得了標(biāo)準(zhǔn)輸出的文件描述符。

深化理解:

    本例程在if中放置的exit(0)導(dǎo)致雖然子進(jìn)程和父進(jìn)程使用相同的代碼段,但是二者執(zhí)行的卻是代碼段不同的內(nèi)容,所以不能很好的體現(xiàn)出子進(jìn)程對(duì)于父進(jìn)程的繼承效果,我們修改例程將if判斷結(jié)束之后的exit取消掉,本返回子進(jìn)程的PID。修改后的程序如下:

#include<stdio.h>
#include<stdlib.h>
#include<sys/types.h>
#include<unistd.h>

int main()
{
    pid_t pid;
    int x = 1;

    pid = fork();
    if( pid == 0 )
    {
        printf("child : x=%d\n",++x);
        /*exit(0);*/
    }

    printf("parent: x=%d\n",--x);
    printf("childpid:child_pid=%d\n",pid);
    exit(0);
}

運(yùn)行結(jié)果如下:

Fighting!hust_smartcar@:~/work/code$./fork_try
parent: x=0
childpid:child_pid=6306
child : x=2
parent: x=1
childpid:child_pid=0

由此更加凸顯了子進(jìn)程對(duì)于父進(jìn)程的繼承效果,以及子進(jìn)程與父進(jìn)程的并發(fā)執(zhí)行。本例中先執(zhí)行的是父進(jìn)程的邏輯控制流,后執(zhí)行的子進(jìn)程的邏輯控制流,所以子進(jìn)程在執(zhí)行

    printf("childpid:child_pid=%d\n",pid);時(shí),并未獲得pid值的更新。

上述就是小編為大家分享的子進(jìn)程創(chuàng)建函數(shù)fork的理解是什么了,如果剛好有類似的疑惑,不妨參照上述分析進(jìn)行理解。如果想知道更多相關(guān)知識(shí),歡迎關(guān)注億速云行業(yè)資訊頻道。

向AI問(wèn)一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如果涉及侵權(quán)請(qǐng)聯(lián)系站長(zhǎng)郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI