Unix操作系統(tǒng)fork 知識
這里我們主要介紹Unix操作系統(tǒng)中的進(jìn)程。分配給Unix操作系統(tǒng)管理員的許多工作之一是確保用戶的程序正確運行。因為Unix操作系統(tǒng)上存在其他并發(fā)運行的程序,所以此任務(wù)變得更加復(fù)雜。由于種種原因,這些程序可能會失敗、掛起或行為異常。在構(gòu)建更可靠的系統(tǒng)時,了解 UNIX® 環(huán)境如何創(chuàng)建、管理和銷毀這些作業(yè)是至關(guān)重要的步驟。
父 PID (PPID) 的存在意味著這是一個由別的進(jìn)程創(chuàng)建的進(jìn)程。最初創(chuàng)建進(jìn)程的原始進(jìn)程名為 init,它始終被賦予 PID 1。init 是將在內(nèi)核啟動時啟動的***個實際進(jìn)程。啟動系統(tǒng)的其余部分是 init 的工作。init 和其他具有 PPID 0 的進(jìn)程屬于內(nèi)核。
Unix操作系統(tǒng)使用 fork 系統(tǒng)調(diào)用
fork(2) 系統(tǒng)調(diào)用創(chuàng)建一個新進(jìn)程。清單 2 顯示了一個簡單 C 代碼片段中使用的 fork。
清單 2. 簡單的 fork(2) 用法
- sunbox$ cat fork1.c
- #include <unistd.h>
- #include <stdio.h>
- int main (void) {
- pid_t p; /* fork returns type pid_t */
- p = fork();
- printf("fork returned %d\n", p);}
- sunbox$ gcc fork1.c -o fork1
- sunbox$ ./fork1
- fork returned 0
- fork returned 698
fork1.c 中的代碼不過就是發(fā)出 fork 調(diào)用,并通過一個 printf 調(diào)用來打印整數(shù)結(jié)果。Unix操作系統(tǒng)雖然只發(fā)出了一個調(diào)用,但是打印了兩次輸出。這是因為在 fork 調(diào)用中創(chuàng)建了一個新進(jìn)程?,F(xiàn)在有兩個單獨的進(jìn)程在從該調(diào)用返回結(jié)果。這通常被描述為“調(diào)用一次,返回兩次”。
fork 返回的值非常有趣。其中一個返回 0;另一個返回一個非零值。獲得 0 的進(jìn)程稱為子進(jìn)程,非零結(jié)果屬于Unix操作系統(tǒng)原始進(jìn)程,即父進(jìn)程。您將使用返回值來確定哪個是父進(jìn)程,哪個是子進(jìn)程。由于兩個進(jìn)程都在同一空間中繼續(xù)運行,***有實際意義的區(qū)別是從 fork 返回的值。
0 和非零返回值的基本原理在于,子進(jìn)程始終可以通過 getppid(2) 調(diào)用來找出其父進(jìn)程是誰,但是父進(jìn)程要找出它的所有子進(jìn)程卻很困難。因此,要告訴父進(jìn)程關(guān)于其新的子進(jìn)程的信息,而子進(jìn)程可在需要時查找其父進(jìn)程。
對Unix操作系統(tǒng)中的父進(jìn)程的基本知識的介紹就到這里。希望對大家對Unix操作系統(tǒng)的學(xué)習(xí)有所幫助。
【編輯推薦】