进程标识符

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

相关文章
相关标签/搜索