進程ID是一個進程的基本屬性,根據進程ID,用戶能夠精確地定位一個進程。一個進程標識符惟一對應一個進程,多個進程標識符能夠對應同一個進程。shell
每個進程在系統中都有一個惟一的ID標識它,這個ID就是進程標識符。進程標識符的類型是pid_t,其本質是一個無符號整型。數據結構
一個進程標識符惟一對應一個進程,多個進程標識符能夠對應同一個進程。這一點其實很好理解,須要知道進程和程序之間的區別,所謂程序指的是可運行的二進制代碼文件,這種文件加載到內存中運行就能夠獲得一個進程。同一個程序能夠加載屢次成爲不一樣的進程,所以標識符和進程之間是一對一的關係,和程序能夠是多對一的關係,以下圖所示:函數
在Linux shell中能夠使用ps命令檢查當前用戶所使用的進程。ui
每個進程有六個重要的ID值,分別是進程ID、父進程ID、有效用戶ID、有效組ID、實際用戶ID和實際組ID。這6個ID保存在內核中的數據結構中,有些時候用戶程序須要獲得這些ID。spa
例如,/proc文件系統下每個進程擁有一個子目錄,裏面存有進程的信息。當使用進程讀取這些文件時,應該先獲得當前進程的進程ID才能肯定進入到哪個進程的相關子目錄。因爲這些ID存儲在內核中,所以Linux提供了一組專門的接口訪問函數來訪問這些ID值。code
函數原型以下:接口
#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
進程ID和父進程ID這2個標識符不能更改,其餘四個ID在適當條件下能夠被更改。進程
下面示例演示了取得一個進程的6個ID:內存
#include <stdio.h> #include <unistd.h> int main(void) { pid_t pid, ppid, uid, euid, gid, egid; pid = getpid(); //進程ID ppid = getppid(); //父進程ID uid = getuid(); //用戶ID euid = geteuid(); //有效用戶ID gid = getgid(); //組ID egid = getegid(); //有效組ID printf("id of current process : %u\n", pid); printf("parent id of current process : %u\n", ppid); printf("user id of current process : %u\n", uid); printf("effective user id of current process : %u\n", euid); printf("group id of current process : %u\n", gid); printf("effective group id of current process : %u\n", egid); return 0; }
運行結果以下:get