fork

fork

計算機程序設計中的分叉函數
fork:叉子、分岔、岔口、複刻,西方人吃飯用的東西,經常用作刀和叉。計算機程序設計中的分叉函數。返回值:若成功調用一次則返回兩個值,子進程返回0,父進程返回子進程标記;否則,出錯返回-1。
  • 中文名:
  • 外文名:
  • 拼音:
  • 近義詞:
  • 反義詞:
  • 名稱:fork
  • 類 型:函數
  • 隸 屬:計算機

中文翻譯

fork:叉子分岔岔口複刻,西方人吃飯用的東西,經常用作刀和叉。

函數原型

pid_tfork(void);(pid_t是一個宏定義,其實質是int被定義在#include中);n返回值:若成功調用一次則返回兩個值,子進程返回0,父進程返回子進程ID;否則,出錯返回-1。

os.fork:

有兩種方式來實現并發性:

1、一種方式是讓每個“任務"或“進程”在單獨的内在空間中工作,每個都有自已的工作内存區域。不過,雖然進程可在單獨的内存空間中執行,但除非這些進程在單獨的處理器上執行,否則,實際并不是“同時”運行的。是由操作系統把處理器的時間片分配給一個進程,用完時間片後就需退出處理器等待另一個時間片的到來。

2、另一種方式是在在程序中指定多個“執行線程”,讓它們在相同的内存空間中工作。這稱為“多線程處理”。線程比進程更有效,因為操作系統不必為每個線程創建單獨的内存空間。

新建進程用os.fork函數。但它隻在POSIX系統上可用,在windows版的python中,os模塊沒有定義os.fork函數。相反,windows程序員用多線程編程技術來完成并發任務。

os.fork函數創建進程的過程是這樣的。程序每次執行時,操作系統都會創建一個新進程來運行程序指令。進程還可調用os.fork,要求操作系統新建一個進程。父進程是調用os.fork函數的進程。父進程所創建的進程叫子進程。每個進程都有一個不重複的進程ID号。或稱pid,它對進程進行标識。子進程與父進程完全相同,子進程從父進程繼承了多個值的拷貝,如全局變量和環境變量。兩個進程的唯一區别是fork的返回值。子進程接收返回值0,而父進程接收子進程的pid作為返回值。一個現有進程可以調用fork函數創建一個新進程。

由fork創建的新進程被稱為(childprocess)子進程。fork函數被調用一次但返回兩次。兩次返回的唯一區别是子進程中返回0值而父進程中返回子進程ID。對于程序,隻要判斷fork的返回值,就知道自己是處于父進程還是子進程中。

子進程是父進程的副本,它将獲得父進程數據空間、堆、棧等資源的副本。注意,子進程持有的是上述存儲空間的“副本”,這意味着父子進程間不共享這些存儲空間,它們之間共享的存儲空間隻有代碼段。n

函數說明

一個現有進程可以調用fork函數創建一個新進程。由fork創建的新進程被稱為(childprocess)子進程。fork函數被調用一次但返回兩次。兩次返回的唯一區别是子進程中返回0值而父進程中返回子進程ID。

子進程是父進程的副本,它将獲得父進程數據空間、堆、棧等資源的副本。注意,子進程持有的是上述存儲空間的“副本”,這意味着父子進程間不共享這些存儲空間。

UNIX将複制父進程的地址空間内容給子進程,因此,子進程有了獨立的地址空間。在不同的UNIX系統下,我們無法确定fork之後是子進程先運行還是父進程先運行,這依賴于系統的實現。所以在移植代碼的時候我們不應該對此作出任何的假設。

為什麼fork會返回兩次?

由于在複制時複制了父進程的堆棧段,所以兩個進程都停留在fork函數中,等待返回。因此fork函數會返回兩次,一次是在父進程中返回,另一次是在子進程中返回,這兩次的返回值是不一樣的。

fork調用的一個奇妙之處就是它僅僅被調用一次,卻能夠返回兩次,它可能有三種不同的返回值:在父進程中,fork返回新創建子進程的進程ID;在子進程中,fork返回0;如果出現錯誤,fork返回一個負值。

在fork函數執行完畢後,如果創建新進程成功,則出現兩個進程,一個是子進程,一個是父進程。在子進程中,fork函數返回0,在父進程中,fork返回新創建子進程的進程ID。我們可以通過fork返回的值來判斷當前進程是子進程還是父進程。引用一位網友的話來解釋fork函數返回的值為什麼在父子進程中不同。“其實就相當于鍊表,進程形成了鍊表,父進程的fork函數返回的值指向子進程的進程id,因為子進程沒有子進程,所以其fork函數返回的值為0。

調用fork之後,數據、堆棧有兩份,代碼仍然為一份但是這個代碼段成為兩個進程的共享代碼段都從fork函數中返回,箭頭表示各自的執行處。當父子進程有一個想要修改數據或者堆棧時,兩個進程真正分裂。fork函數的特點概括起來就是“調用一次,返回兩次”,在父進程中調用一次,在父進程和子進程中各返回一次。fork的另一個特性是所有由父進程打開的描述符都被複制到子進程中。父、子進程中相同編号的文件描述符在内核中指向同一個file結構體,也就是說,file結構體的引用計數要增加。n

相關詞條

相關搜索

其它詞條