#include/*功能:復制進程參數:無返回值:成功:父進程:返回子進程id子進程:返回0失敗:返回-1*/pid_tfork(void);由fork創建的新進程被稱為子進程(childprocess)。該函數被調用一次,但返回兩次。兩次返回的差別是子進程的返回值是0,而父進程的返回值則是新進程(子進程)的進程id。將子進程id返回給父進程的理由是:由于一個進程的子進程能夠多于一個,沒有一個函" />

亚洲免费在线-亚洲免费在线播放-亚洲免费在线观看-亚洲免费在线观看视频-亚洲免费在线看-亚洲免费在线视频

linux fork函數淺析

系統 2045 0

由fork創建的新進程被稱為子進程(child process)。該函數被調用一次,但返回兩次。兩次返回的差別是子進程的返回值是0,而父進程的返回值則是新進程(子進程)的進程 id。將子進程id返回給父進程的理由是:由于一個進程的子進程能夠多于一個,沒有一個函數使一個進程能夠獲得其全部子進程的進程id。 對子進程來說,之所以fork返回0給它,是由于它隨時能夠調用getpid()來獲取自己的pid;也能夠調用getppid()來獲取父進程的id。(進程id 0總是由交換進程使用,所以一個子進程的進程id不可能為0 )。

fork之后,操作系統會復制一個與父進程全然同樣的子進程,雖說是父子關系,可是在操作系統看來,他們更像兄弟關系,這2個進程共享代碼空間,可是數據空間是互相獨立的,子進程數據空間中的內容是父進程的完整拷貝,指令指針也全然同樣,子進程擁有父進程當前執行到的位置(兩進程的程序計數器pc值同樣,也就是說,子進程是從fork返回處開始執行的),但有一點不同,假設fork成功,子進程中fork的返回值是0,父進程中fork的返回值是子進程的進程號,假設fork不成功,父進程會返回錯誤。
能夠這樣想象,2個進程一直同一時候執行,并且步調一致,在fork之后,他們分別作不同的工作,也就是分岔了。這也是fork為什么叫fork的原因

至于那一個最先執行,可能與操作系統(調度算法)有關,并且這個問題在實際應用中并不重要,假設須要父子進程協同,能夠通過原語的辦法解決。

?

一個fork樣例

要搞清楚fork的運行過程,就必須先弄清楚操作系統中的“進程(process)”概念。一個進程,主要包括三個元素:
o. 一個能夠運行的程序;
o. 和該進程相關聯的所有數據(包含變量,內存空間,緩沖區等等);
o. 程序的運行上下文(execution context)。

最好還是簡單理解為,一個進程表示的,就是一個可運行程序的一次運行過程中的一個狀態。操作系統對進程的管理,典型的情況,是通過進程表完畢的。進程表中的每個表項,記錄的是當前操作系統中一個進程的情況。對于單 CPU的情況而言,每一特定時刻僅僅有一個進程占用 CPU,可是系統中可能同一時候存在多個活動的(等待運行或繼續運行的)進程。
一個稱為“程序計數器(program counter, pc)”的寄存器,指出當前占用 CPU的進程要運行的下一條指令的位置。
當分給某個進程的 CPU時間已經用完,操作系統將該進程相關的寄存器的值,保存到該進程在進程表中相應的表項里面;把將要接替這個進程占用 CPU的那個進程的上下文,從進程表中讀出,并更新相應的寄存器(這個過程稱為“上下文交換(process context switch)”,實際的上下文交換須要涉及到很多其它的數據,那和fork無關,不再多說,主要要記住程序寄存器pc記錄了程序當前已經運行到哪里,是進程上下文的重要內容,換出 CPU的進程要保存這個寄存器的值,換入CPU的進程,也要依據進程表中保存的本進程運行上下文信息,更新這個寄存器)。
好了,有這些概念打底,能夠說fork了。當你的程序運行到以下的語句:pid=fork();?

操作系統創建一個新的進程(子進程),而且在進程表中對應為它建立一個新的表項。新進程和原有進程的可運行程序是同一個程序;上下文和數據, 絕大部分 就是原進程(父進程)的拷貝,但它們是兩個相互獨立的進程!此時程序寄存器pc,在父、子進程的上下文中都聲稱,這個進程眼下運行到fork調用即將返回(此時子進程不占有CPU,子進程的pc不是真正保存在寄存器中,而是作為進程上下文保存在進程表中的相應表項內)。問題是怎么返回,在父子進程中就分道揚鑣。

(如果父進程一直占領CPU,實際情況非常可能不一樣)父進程繼續運行,操作系統對fork的實現,使這個調用在父進程中返回剛剛創建的子進程的pid(一個正整數),所以以下的swtich語句中運行了default分支(case -1,case 0分支都不滿足)。所以輸出I am the parent process...

子進程在之后的某個時候得到調度,它的上下文被換入,占領 CPU,操作系統對fork的實現,使得子進程中fork調用返回0,所以在這個進程(注意這不是父進程了哦,盡管是同一個程序,可是這是同一個程序的另外一次運行,在操作系統中這次運行是由另外一個進程表示的,從運行的角度說和父進程相互獨立)中pid=0。這個進程繼續運行的過程中,switch語句中 case -1不滿足,可是case 0是滿足。所以輸出I am the child process..

?

程序的執行結果(先輸出I am the parent process...,還是I am the parent process...)不可預見,與操作系統實際執行情況有關!

linux fork函數淺析


更多文章、技術交流、商務合作、聯系博主

微信掃碼或搜索:z360901061

微信掃一掃加我為好友

QQ號聯系: 360901061

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描下面二維碼支持博主2元、5元、10元、20元等您想捐的金額吧,狠狠點擊下面給點支持吧,站長非常感激您!手機微信長按不能支付解決辦法:請將微信支付二維碼保存到相冊,切換到微信,然后點擊微信右上角掃一掃功能,選擇支付二維碼完成支付。

【本文對您有幫助就好】

您的支持是博主寫作最大的動力,如果您喜歡我的文章,感覺我的文章對您有幫助,請用微信掃描上面二維碼支持博主2元、5元、10元、自定義金額等您想捐的金額吧,站長會非常 感謝您的哦!!!

發表我的評論
最新評論 總共0條評論
主站蜘蛛池模板: 国产农村精品一级毛片视频 | 国产911情侣拍拍在线播放 | 亚洲精品久久久久午夜福 | 99热最新网址| 久久网站在线观看 | 国产精品视频福利 | 久久久久亚洲精品一区二区三区 | 播五月综合 | 深夜在线小视频 | 69日本人xxxx16—18 | 91最新免费地址入口 | 国产精品三区四区 | 国产精品一区二区资源 | 天天操天天摸天天爽 | 99久久99热精品免费观看国产 | 久久成人亚洲 | 精品视频 九九九 | 99精品在线免费观看 | 97dyy在线观看手机版 | 久久精品影院永久网址 | 97久久精品视频 | 在线亚洲日产一区二区 | 亚洲色视频在线播放网站 | 中国jizz| 狠狠的色 | 色综合网亚洲精品久久久 | 午夜性爽视频男人的天堂在线 | 老子影院午夜伦手机不卡无 | 午夜毛片视频 | 精品少妇一区二区三区视频 | 在线精品中文字幕福利视频 | 精品久久久中文字幕一区 | 亚洲合集综合久久性色 | 全部免费特黄特色大片中国 | 精品国产日韩亚洲一区在线 | 欧美中文字幕在线视频 | 亚洲免费片 | 亚洲swag精品自拍一区 | 天天艹在线 | 婷婷综合五月中文字幕欧美 | 在线观看日韩精品 |