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