一、進程標識

  進程ID 0是調度進程,常常被稱為交換進程(swapper)。該進程并不執(zhí)行任何磁盤上的程序--它是內(nèi)核的一部分,因此也被稱為系統(tǒng)進程。進程ID 1是init進程,在自舉(bootstrapping)過程結束時由內(nèi)核調用。該進程的程序文件在UNIX的早期版本中是/etc/init,在較新版本中是/sbin/init。此進程負責在內(nèi)核自舉后啟動一個UNIX系統(tǒng)。init通常讀與系統(tǒng)有關的初始化(/etc/rc*文件),并將系統(tǒng)引導到一個狀態(tài)(例如多用戶)。init進程決不會終止。它是一個普通的用戶進程(與交換進程不同,它不是內(nèi)核中的系統(tǒng)進程),但是它以超級用戶特權運行。
  在某些UNIX的虛存實現(xiàn)中,進程ID 2是頁精靈進程(pagedaemon)。此進程負責支持虛存系統(tǒng)的請頁操作。與交換進程一樣,頁精靈進程也是內(nèi)核進程。
除了進程ID,每個進程還有其他標識符。下列函數(shù)可以返回這些標識符:

#include <sys/types.h>#include <unistd.h>pid_t getpid(void);
返回: 調用進程的進程ID
pid_t getppid(void);
返回: 調用進程的父進程ID
uid_t getuid(void);
返回: 調用進程的實際用戶ID
uid_t geteuid(void);
返回: 調用進程的有效用戶ID
gid_t getgid(void);
返回: 調用進程的實際組ID
gid_t getegid(void);
返回: 調用進程的有效阻ID

這些函數(shù)都沒有出錯返回

二、fork函數(shù)

  一個進程調用fork函數(shù)是UNIX內(nèi)核創(chuàng)建一個新進程的唯一方法(除了交換進程、init進程和頁精靈進程)

#include <sys/types.h>#include <unistd.h>pid_t fork(void);
返回: 子進程中為0,父進程中為子進程的進程ID,出錯為-1.

  子進程和父進程繼續(xù)執(zhí)行fork之后的指令。子進程是父進程的復制品。例如,進程獲得父進程數(shù)據(jù)空間、堆和棧的復制品。但是這些都是進程擁有的拷貝不是與父進程共享。如果正文段是只讀的,則父、子進程共享正文段。
  現(xiàn)在很多實現(xiàn)并不做一個父進程數(shù)據(jù)段和堆的完全拷貝,因為在fork之后經(jīng)常跟隨著exec。作為替代,使用了在**寫時復制(Copy On Write, COW)**的技術。這些區(qū)域由父、子進程共享,而且內(nèi)核將它們的存取權限改成只讀的。如果有進程試圖修改這些區(qū)域,則內(nèi)核為有關部分(典型的是虛存系統(tǒng)中的"頁"),做一個拷貝