vfork和fork區(qū)別

fork:

創(chuàng)新互聯(lián)公司專注為客戶提供全方位的互聯(lián)網(wǎng)綜合服務(wù),包含不限于成都做網(wǎng)站、網(wǎng)站設(shè)計(jì)、南開網(wǎng)絡(luò)推廣、成都微信小程序、南開網(wǎng)絡(luò)營銷、南開企業(yè)策劃、南開品牌公關(guān)、搜索引擎seo、人物專訪、企業(yè)宣傳片、企業(yè)代運(yùn)營等,從售前售中售后,我們都將竭誠為您服務(wù),您的肯定,是我們最大的嘉獎(jiǎng);創(chuàng)新互聯(lián)公司為所有大學(xué)生創(chuàng)業(yè)者提供南開建站搭建服務(wù),24小時(shí)服務(wù)熱線:13518219792,官方網(wǎng)址:muchs.cn

   一個(gè)現(xiàn)有進(jìn)程可以調(diào)用fork創(chuàng)建一個(gè)新進(jìn)程。


   返回值:子進(jìn)程中返回0,父進(jìn)程返回子進(jìn)程ID,出錯(cuò)返回零。

    子進(jìn)程是父進(jìn)程的副本。

一個(gè)現(xiàn)有進(jìn)程可以調(diào)用fork函數(shù)創(chuàng)建一個(gè)新進(jìn)程。由fork創(chuàng)建的新進(jìn)程被稱為子進(jìn)程(child process)。fork函數(shù)被調(diào)用一次但返回兩次。兩次返回的唯一區(qū)別是子進(jìn)程中返回0值而父進(jìn)程中返回子進(jìn)程ID。

子進(jìn)程是父進(jìn)程的副本,它將獲得父進(jìn)程數(shù)據(jù)空間、堆、棧等資源的副本。注意,子進(jìn)程持有的是上述存儲(chǔ)空間的"副本",這意味著父子進(jìn)程間不共享這些存儲(chǔ)空間。

UNIX將復(fù)制父進(jìn)程的地址空間內(nèi)容給子進(jìn)程,因此,子進(jìn)程有了獨(dú)立的地址空間。在不同的UNIX (Like)系統(tǒng)下,我們無法確定fork之后是子進(jìn)程先運(yùn)行還是父進(jìn)程先運(yùn)行,這依賴于系統(tǒng)的實(shí)現(xiàn)。所以在移植代碼的時(shí)候我們不應(yīng)該對(duì)此作出任何的假設(shè)。

為什么fork會(huì)返回兩次?

由于在復(fù)制時(shí)復(fù)制了父進(jìn)程的堆棧段,所以兩個(gè)進(jìn)程都停留在fork函數(shù)中,等待返回。因此fork函數(shù)會(huì)返回兩次,一次是在父進(jìn)程中返回,另一次是在子進(jìn)程中返回,這兩次的返回值是不一樣的。過程如下圖。

在fork函數(shù)執(zhí)行完畢后,如果創(chuàng)建新進(jìn)程成功,則出現(xiàn)兩個(gè)進(jìn)程,一個(gè)是子進(jìn)程,一個(gè)是父進(jìn)程。在子進(jìn)程中,fork函數(shù)返回0,在父進(jìn)程中,fork返回新創(chuàng)建子進(jìn)程的進(jìn)程ID。我們可以通過fork返回的值來判斷當(dāng)前進(jìn)程是子進(jìn)程還是父進(jìn)程。

父進(jìn)程的fork函數(shù)返回的值指向子進(jìn)程的進(jìn)程id, 因?yàn)樽舆M(jìn)程沒有子進(jìn)程,所以其fork函數(shù)返回的值為0.

調(diào)用fork之后,數(shù)據(jù)、堆棧有兩份,代碼仍然為一份但是這個(gè)代碼段成為兩個(gè)進(jìn)程的共享代碼段都從fork函數(shù)中返回,箭頭表示各自的執(zhí)行處。當(dāng)父子進(jìn)程有一個(gè)想要修改數(shù)據(jù)或者堆棧時(shí),兩個(gè)進(jìn)程真正分裂。

    fork的一個(gè)特性是父進(jìn)程的所有打開文件描述符都被復(fù)制到子進(jìn)程中。父子進(jìn)程的每個(gè)相同的打開描述符共享一個(gè)文件表項(xiàng)。

    在fork之后處理的文件描述符有兩種常見的情況:


    1.父進(jìn)程等待子進(jìn)程完成。在這種情況下,父進(jìn)程無需對(duì)其描述符做任何處理。當(dāng)子進(jìn)程終止后,子進(jìn)程對(duì)文件偏移量的修改已執(zhí)行的更新。


    2. 父子進(jìn)程各自執(zhí)行不同的程序段。這種情況下,在fork之后,父字進(jìn)程各自關(guān)閉他們不需要使用的文件描述符,這樣就不會(huì)干擾對(duì)方使件描用文件述符。 這種方法在網(wǎng)絡(luò)服務(wù)進(jìn)程中經(jīng)常使用。


父子進(jìn)程之間的區(qū)別:


1. fork的返回值
2. 進(jìn)程ID不同
3. 具有不同的父進(jìn)程ID
4. 子進(jìn)程的tms_utime、 tms_stime、 tms_cutime及tms_ustime均被設(shè)置為0
5. 父進(jìn)程設(shè)置的文件鎖不會(huì)被子進(jìn)程繼承
6. 子進(jìn)程的未處理鬧鐘被清除
7. 子進(jìn)程的未處理信號(hào)集被設(shè)置為空集

fork調(diào)用失敗的原因:


1.系統(tǒng)中有太多的進(jìn)程

2. 實(shí)際用戶的進(jìn)程數(shù)超過了限制

vfork和fork區(qū)別

vfork函數(shù)


vfork用于創(chuàng)建一個(gè)新進(jìn)程,而該新進(jìn)程的目的是exec一個(gè)新程序。 vfork與fork都創(chuàng)建一個(gè)子進(jìn)程,但它不將父進(jìn)程的地址空間復(fù)制到子進(jìn)程中,因?yàn)樽舆M(jìn)程會(huì)立即調(diào)用exec,于是不會(huì)存訪問該地址空間。相反,在子進(jìn)程調(diào)用exec或exit之前,它在父進(jìn)程的空間中運(yùn)行,也就是說會(huì)更改父進(jìn)程的數(shù)據(jù)段、棧和堆。vfork和fork另一區(qū)別在于: vfork保證子進(jìn)程先運(yùn)行,在它調(diào)用exec或( exit)之后父進(jìn)程才可能被調(diào)度運(yùn)行。

本文題目:vfork和fork區(qū)別
瀏覽地址:http://muchs.cn/article0/gdsgoo.html

成都網(wǎng)站建設(shè)公司_創(chuàng)新互聯(lián),為您提供靜態(tài)網(wǎng)站、App開發(fā)、全網(wǎng)營銷推廣、、云服務(wù)器、網(wǎng)站改版

廣告

聲明:本網(wǎng)站發(fā)布的內(nèi)容(圖片、視頻和文字)以用戶投稿、用戶轉(zhuǎn)載內(nèi)容為主,如果涉及侵權(quán)請(qǐng)盡快告知,我們將會(huì)在第一時(shí)間刪除。文章觀點(diǎn)不代表本網(wǎng)站立場(chǎng),如需處理請(qǐng)聯(lián)系客服。電話:028-86922220;郵箱:631063699@qq.com。內(nèi)容未經(jīng)允許不得轉(zhuǎn)載,或轉(zhuǎn)載時(shí)需注明來源: 創(chuàng)新互聯(lián)

成都定制網(wǎng)站建設(shè)