一、進(jìn)程標(biāo)識
進(jìn)程ID 0是調(diào)度進(jìn)程,常常被稱為交換進(jìn)程(swapper)。該進(jìn)程并不執(zhí)行任何磁盤上的程序--它是內(nèi)核的一部分,因此也被稱為系統(tǒng)進(jìn)程。進(jìn)程ID 1是init進(jìn)程,在自舉(bootstrapping)過程結(jié)束時(shí)由內(nèi)核調(diào)用。該進(jìn)程的程序文件在UNIX的早期版本中是/etc/init,在較新版本中是/sbin/init。此進(jìn)程負(fù)責(zé)在內(nèi)核自舉后啟動一個(gè)UNIX系統(tǒng)。init通常讀與系統(tǒng)有關(guān)的初始化(/etc/rc*文件),并將系統(tǒng)引導(dǎo)到一個(gè)狀態(tài)(例如多用戶)。init進(jìn)程決不會終止。它是一個(gè)普通的用戶進(jìn)程(與交換進(jìn)程不同,它不是內(nèi)核中的系統(tǒng)進(jìn)程),但是它以超級用戶特權(quán)運(yùn)行。
在某些UNIX的虛存實(shí)現(xiàn)中,進(jìn)程ID 2是頁精靈進(jìn)程(pagedaemon)。此進(jìn)程負(fù)責(zé)支持虛存系統(tǒng)的請頁操作。與交換進(jìn)程一樣,頁精靈進(jìn)程也是內(nèi)核進(jìn)程。
除了進(jìn)程ID,每個(gè)進(jìn)程還有其他標(biāo)識符。下列函數(shù)可以返回這些標(biāo)識符:
#include <sys/types.h>#include <unistd.h>pid_t getpid(void); 返回: 調(diào)用進(jìn)程的進(jìn)程ID pid_t getppid(void); 返回: 調(diào)用進(jìn)程的父進(jìn)程ID uid_t getuid(void); 返回: 調(diào)用進(jìn)程的實(shí)際用戶ID uid_t geteuid(void); 返回: 調(diào)用進(jìn)程的有效用戶ID gid_t getgid(void); 返回: 調(diào)用進(jìn)程的實(shí)際組ID gid_t getegid(void); 返回: 調(diào)用進(jìn)程的有效阻ID
這些函數(shù)都沒有出錯(cuò)返回
二、fork函數(shù)
一個(gè)進(jìn)程調(diào)用fork函數(shù)是UNIX內(nèi)核創(chuàng)建一個(gè)新進(jìn)程的唯一方法(除了交換進(jìn)程、init進(jìn)程和頁精靈進(jìn)程)
#include <sys/types.h>#include <unistd.h>pid_t fork(void); 返回: 子進(jìn)程中為0,父進(jìn)程中為子進(jìn)程的進(jìn)程ID,出錯(cuò)為-1.
子進(jìn)程和父進(jìn)程繼續(xù)執(zhí)行fork之后的指令。子進(jìn)程是父進(jìn)程的復(fù)制品。例如,進(jìn)程獲得父進(jìn)程數(shù)據(jù)空間、堆和棧的復(fù)制品。但是這些都是進(jìn)程擁有的拷貝不是與父進(jìn)程共享。如果正文段是只讀的,則父、子進(jìn)程共享正文段。
現(xiàn)在很多實(shí)現(xiàn)并不做一個(gè)父進(jìn)程數(shù)據(jù)段和堆的完全拷貝,因?yàn)樵趂ork之后經(jīng)常跟隨著exec。作為替代,使用了在**寫時(shí)復(fù)制(Copy On Write, COW)**的技術(shù)。這些區(qū)域由父、子進(jìn)程共享,而且內(nèi)核將它們的存取權(quán)限改成只讀的。如果有進(jìn)程試圖修改這些區(qū)域,則內(nèi)核為有關(guān)部分(典型的是虛存系統(tǒng)中的"頁"),做一個(gè)拷貝