進程標識符

進程ID是一個進程的基本屬性,根據進程ID,用戶能夠精確地定位一個進程。一個進程標識符惟一對應一個進程,多個進程標識符能夠對應同一個進程。shell

1、進程ID

    每個進程在系統中都有一個惟一的ID標識它,這個ID就是進程標識符。進程標識符的類型是pid_t,其本質是一個無符號整型。數據結構

    一個進程標識符惟一對應一個進程,多個進程標識符能夠對應同一個進程。這一點其實很好理解,須要知道進程和程序之間的區別,所謂程序指的是可運行的二進制代碼文件,這種文件加載到內存中運行就能夠獲得一個進程。同一個程序能夠加載屢次成爲不一樣的進程,所以標識符和進程之間是一對一的關係,和程序能夠是多對一的關係,以下圖所示:函數

在Linux shell中能夠使用ps命令檢查當前用戶所使用的進程。ui

2、進程中重要的ID值

每個進程有六個重要的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

相關文章
相關標籤/搜索