您好,登錄后才能下訂單哦!
這期內(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è)資訊頻道。
免責(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)容。