进程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