linux---谈谈vfork和fork的区别及exit与return
fork():創(chuàng)建子進(jìn)程的函數(shù),是大家比較熟悉的吧。pid_t id = fork();
這里的vfork();也是創(chuàng)建子進(jìn)程的函數(shù)。現(xiàn)在我們來(lái)剖析一下它們吧。
第一例:
先看一個(gè)fork()的例子哦。
對(duì)于fork()而言,創(chuàng)建子進(jìn)程成功后直接打印出父子進(jìn)程執(zhí)行的兩條語(yǔ)句。即:
這里要特別強(qiáng)調(diào)的是:父子進(jìn)程的調(diào)度的順序是由調(diào)度器決定的。
再看看vfork()函數(shù):
這里有一個(gè)重要的函數(shù):exit(1);這也是vfork()中特別重要的一點(diǎn),如果在子進(jìn)程中不使用exit(1)會(huì)怎么樣呢?這意味著父進(jìn)程永遠(yuǎn)不會(huì)運(yùn)行。如:
這里的父進(jìn)程的pid在創(chuàng)建子進(jìn)程前是多少現(xiàn)在還是多少。即子進(jìn)程一直在運(yùn)行。這就是因?yàn)闆](méi)有使用exit(1)的原因。
子進(jìn)程如果調(diào)用了exit(1);說(shuō)明子進(jìn)程結(jié)束后調(diào)用父進(jìn)程。(這里也說(shuō)明vfork()的一大特點(diǎn):先調(diào)用子進(jìn)程,等子進(jìn)程的exit(1)被調(diào)用后,再調(diào)用父進(jìn)程)所以結(jié)果如下:
第二例:
看一看它們的地址空間哦:
vfork():
這里看一下他們的地址空間是如何分配的。看看運(yùn)行的結(jié)果:
看的出來(lái),他們的虛擬地址空間是一樣的,這一點(diǎn)和fork()函數(shù)是一樣的。重要的是,當(dāng)子進(jìn)程中將g_val的值改變了之后,父進(jìn)程也隨之改變,這一點(diǎn)卻是和fork()不一樣的,進(jìn)而引出vfork()函數(shù)的另一大特點(diǎn):在子進(jìn)程調(diào)用exit之前,它在父進(jìn)程的空間中運(yùn)行,也就是說(shuō)會(huì)更改父進(jìn)程的數(shù)據(jù)段、棧和堆。。
如:
運(yùn)行結(jié)果:
fork()函數(shù):它的虛擬地址是相同的,但是值卻不相同,它們所指的物理地址也是不同的。
據(jù)上所述,總結(jié)一下fork()與vfork()的區(qū)別吧~~~:>>
主要為兩點(diǎn):
(1)執(zhí)行次序:fork():對(duì)父子進(jìn)程的調(diào)度室由調(diào)度器決定的;
? ? ? ?vfork():是先調(diào)用子進(jìn)程,等子進(jìn)程的exit(1)被調(diào)用后,再調(diào)用父進(jìn)程;
(2)對(duì)數(shù)據(jù)段的影響:fork():父子進(jìn)程不共享一段地址空間,修改子進(jìn)程,父進(jìn)程的內(nèi)容并不會(huì)受影響。
? ? ? ? ? ??vfork():在子進(jìn)程調(diào)用exit之前,它在父進(jìn)程的空間中運(yùn)行,也就是說(shuō)會(huì)更改父進(jìn)程的數(shù)據(jù)段、 ? ? ? ? ? ? ? ? ?棧和堆。。即共享代碼區(qū)和數(shù)據(jù)區(qū),且地址和內(nèi)容都是一樣的。
第三例:
這個(gè)例子是關(guān)于vfork()創(chuàng)建子進(jìn)程,且子進(jìn)程用return返回。
運(yùn)行結(jié)果:
子進(jìn)程返回時(shí),運(yùn)行結(jié)果是執(zhí)行后程序一直不斷地重復(fù)運(yùn)行,不斷創(chuàng)建子進(jìn)程;
子進(jìn)程return 1在一個(gè)函數(shù)中是正常的返回過(guò)程,它會(huì)使得程序返回到函數(shù)被調(diào)用處,回復(fù)之前的執(zhí)行流程,又會(huì)輸出父子進(jìn)程,所以不像exit一樣,直接終止進(jìn)程。
就先說(shuō)到這里啦,有什么建議還會(huì)做改進(jìn)哦~~
總結(jié)
以上是生活随笔為你收集整理的linux---谈谈vfork和fork的区别及exit与return的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 性激素六项检查不孕
- 下一篇: linux之多线程(1)