进程标识符

原创
2016/11/27 15:23
阅读数 514

进程ID是一个进程的基本属性,根据进程ID,用户可以精确地定位一个进程。一个进程标识符唯一对应一个进程,多个进程标识符可以对应同一个进程。

一、进程ID

    每一个进程在系统中都有一个唯一的ID标识它,这个ID就是进程标识符。进程标识符的类型是pid_t,其本质是一个无符号整型。

    一个进程标识符唯一对应一个进程,多个进程标识符可以对应同一个进程。这一点其实很好理解,需要知道进程和程序之间的区别,所谓程序指的是可运行的二进制代码文件,这种文件加载到内存中运行就可以得到一个进程。同一个程序可以加载多次成为不同的进程,因此标识符和进程之间是一对一的关系,和程序可以是多对一的关系,如下图所示:

在Linux shell中可以使用ps命令检查当前用户所使用的进程。

二、进程中重要的ID值

每一个进程有六个重要的ID值,分别是进程ID、父进程ID、有效用户ID、有效组ID、实际用户ID和实际组ID。这6个ID保存在内核中的数据结构中,有些时候用户程序需要得到这些ID。

例如,/proc文件系统下每一个进程拥有一个子目录,里面存有进程的信息。当使用进程读取这些文件时,应该先得到当前进程的进程ID才能确定进入到哪一个进程的相关子目录。由于这些ID存储在内核中,因此Linux提供了一组专门的接口访问函数来访问这些ID值。

函数原型如下:

#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;
}

运行结果如下:

 

展开阅读全文
打赏
0
0 收藏
分享
加载中
更多评论
打赏
0 评论
0 收藏
0
分享
返回顶部
顶部