CREDENTIALS - Linux手册页
Linux程序员手册 第7部分
更新日期: 2020-06-09
名称
凭证-进程标识符
说明
Process ID (PID)
每个进程都有一个唯一的非负整数标识符,该标识符在使用fork(2)创建进程时分配。进程可以使用getpid(2)获得其PID。 PID使用pid_t类型(在中定义)表示。
PID用于一系列系统调用中,以识别受该调用影响的进程,例如:kill(2),ptrace(2),setpriority(2),setpgid(2),setsid(2),sigqueue(3),和waitpid(2)。
进程的PID保留在execve(2)中。
Parent process ID (PPID)
进程的父进程ID标识使用fork(2)创建此进程的进程。进程可以使用getppid(2)获得其PPID。 PPID使用类型pid_t表示。
进程的PPID在execve(2)中保留。
Process group ID and session ID
每个进程都有一个会话ID和一个进程组ID,都使用pid_t类型表示。进程可以使用getsid(2)获得其会话ID,并可以使用getpgrp(2)获得其进程组ID。
fork(2)创建的子级继承其父级的会话ID和进程组ID。进程的会话ID和进程组ID在execve(2)中保留。
会话和进程组是设计用于支持Shell作业控制的抽象。流程组(有时称为"工作")是共享相同流程组ID的流程的集合; Shell为用于执行单个命令或管道的进程创建了一个新的进程组(例如,为执行命令" ls | wc"而创建的两个进程位于同一进程组中)。可以使用setpgid(2)设置进程的组成员身份。进程ID与其进程组ID相同的进程是该组的进程组负责人。
会话是共享相同会话ID的进程的集合。流程组的所有成员也具有相同的会话ID(即,流程组的所有成员始终属于同一会话,因此会话和流程组形成严格的两级流程层次结构。)当进程调用setsid(2)时,会创建一个新会话,这将创建一个新会话,该会话的会话ID与调用setsid(2)的进程的PID相同。会话的创建者称为会话负责人。
会话中的所有进程共享一个控制终端。当会话负责人第一次打开终端时(除非在调用open(2)时指定了O_NOCTTY标志),将建立控制终端。终端可以是最多一个会话的控制终端。
会话中的作业最多只能是前台作业。会话中的其他作业是后台作业。只能从终端读取前台作业;当后台的进程尝试从终端读取时,将向其进程组发送SIGTTIN信号,该信号将挂起作业。如果已为终端设置了TOSTOP标志(请参阅termios(3)),则只有前台作业可以写入终端;否则,仅可将前台作业写入终端。从后台作业进行写操作将导致生成SIGTTOU信号,从而挂起作业。当按下产生信号的终端键(例如中断键,通常为Control-C)时,该信号将发送到前台作业中的进程。
各种系统调用和库函数可以在进程组的所有成员上运行,包括kill(2),killpg(3),getpriority(2),setpriority(2),ioprio_get(2),ioprio_set(2),waitid(2) )和waitpid(2)。另请参见fcntl(2)中有关F_GETOWN,F_GETOWN_EX,F_SETOWN和F_SETOWN_EX操作的讨论。
User and group identifiers
每个进程都有各种关联的用户和组ID。这些ID是整数,分别使用uid_t和gid_t类型(在中定义)表示。
在Linux上,每个进程都有以下用户和组标识符:
- *
- 真实用户ID和真实组ID。这些ID确定谁是进程的所有者。进程可以使用getuid(2)(getgid(2))获得其真实用户(组)ID。
- *
- 有效的用户ID和有效的组ID。内核使用这些ID来确定进程在访问共享资源(例如消息队列,共享内存和信号灯)时将拥有的权限。在大多数UNIX系统上,这些ID还会确定访问文件时的权限。但是,Linux使用以下描述的文件系统ID来完成此任务。进程可以使用geteuid(2)(getegid(2))获得其有效的用户(组)ID。
- *
- 已保存的设置用户ID和已保存的设置组ID。这些ID在set-user-ID和set-group-ID程序中使用,以保存执行程序时设置的相应有效ID的副本(请参阅execve(2))。设置用户ID程序可以通过在其实际用户ID和已保存的设置用户ID的值之间来回切换其有效用户ID来获得和放弃特权。通过调用seteuid(2),setreuid(2)或setresuid(2)完成此切换。 set-group-ID程序使用setegid(2),setregid(2)或setresgid(2)执行类似的任务。进程可以使用getresuid(2)(getresgid(2))获得其保存的设置用户ID(set-group-ID)。
- *
- 文件系统用户标识和文件系统组标识(特定于Linux)。这些ID与下面描述的补充组ID一起用于确定访问文件的权限。有关详细信息,请参见path_resolution(7)。每当更改进程的有效用户(组)ID时,内核也会自动将文件系统用户(组)ID更改为相同的值。因此,文件系统ID通常具有与相应的有效ID相同的值,因此文件许可权检查的语义在Linux上与在其他UNIX系统上相同。通过调用setfsuid(2)和setfsgid(2),可以使文件系统ID与有效ID不同。
- *
- 补充组ID。这是一组其他组ID,用于在访问文件和其他共享资源时进行权限检查。在2.6.4之前的Linux内核上,一个进程最多可以是32个补充组的成员。从内核2.6.4开始,一个进程最多可以是65536个补充组的成员。调用sysconf(_SC_NGROUPS_MAX)可用于确定进程可能是其成员的补充组的数量。进程可以使用getgroups(2)获得其补充组ID集。
fork(2)创建的子进程继承其父级用户和组ID的副本。在execve(2)期间,将保留进程的真实用户和组ID以及补充组ID;有效和已保存的集合ID可以更改,如execve(2)中所述。
除了上述目的外,还可以在许多其他上下文中使用进程的用户ID:
- *
- 确定发送信号的权限时(请参阅kill(2));
- *
- 在使用setpriority(2),sched_setaffinity(2),sched_setscheduler(2),sched_setparam(2)确定用于设置进程调度参数(尼斯值,实时调度策略和优先级,CPU关联性,I / O优先级)的权限时, sched_setattr(2)和ioprio_set(2);
- *
- 检查资源限制时(请参阅getrlimit(2));
- *
- 在检查进程可能创建的inotify实例的数量限制时(请参见inotify(7))。
Modifying process user and group IDs
根据相关手册页中描述的规则,流程可以使用以下API来修改其用户ID和组ID:
- setuid(2) (setgid(2))
- 修改进程的真实(可能是有效的并已保存的)用户(组)ID。
- seteuid(2) (setegid(2))
- 修改流程的有效用户(组)ID。
- setfsuid(2) (setfsgid(2))
- 修改进程的文件系统用户(组)ID。
- setreuid(2) (setregid(2))
- 修改过程的真实有效的(可能是已保存的)用户(组)ID。
- setresuid(2) (setresgid(2))
- 修改过程的真实,有效和已保存设置的用户(组)ID。
- setgroups(2)
- 修改进程的补充组列表。
对流程的有效用户(组)ID的任何更改都将自动转移到流程的文件系统用户(组)ID。如prctl(2)中所述,对流程有效用户或组ID的更改也会影响流程" dumpable"属性。
更改流程用户和组ID可能会影响流程的功能,如功能(7)中所述。
遵循规范
进程ID,父进程ID,进程组ID和会话ID在POSIX.1中指定。在POSIX.1中指定了真实,有效和已保存的设置的用户和组ID,以及补充的组ID。文件系统用户和组ID是Linux扩展。
备注
/ proc / [pid] / status文件中的各个字段显示上述进程凭证。有关更多信息,请参见proc(5)。
POSIX线程规范要求凭据由进程中的所有线程共享。但是,在内核级别,Linux为每个线程维护单独的用户和组凭据。 NPTL线程实现会做一些工作,以确保对用户或组凭据的任何更改(例如,对setuid(2),setresuid(2)的调用)都可以在过程中传递给所有POSIX线程。有关更多详细信息,请参见nptl(7)。
另外参见
bash(1),csh(1),groups(1),id(1),newgrp(1),ps(1),runuser(1),setpriv(1),sg(1),su(1), access(2),execve(2),faccessat(2),fork(2),getgroups(2),getpgrp(2),getpid(2),getppid(2),getsid(2),kill(2), setegid(2),seteuid(2),setfsgid(2),setfsuid(2),setgid(2),setgroups(2),setpgid(2),setresgid(2),setresuid(2),setsid(2), setuid(2),waitpid(2),euidaccess(3),initgroups(3),killpg(3),tcgetpgrp(3),tcgetsid(3),tcsetpgrp(3),group(5),passwd(5),影子(5),功能(7),名称空间(7),路径解析(7),pid_namespaces(7),pthreads(7),signal(7),unix(7),user_namespaces(7),sudo(8)
出版信息
这个页面是Linux手册页项目5.08版的一部分。有关项目的说明、有关报告错误的信息以及此页面的最新版本,请访问https://www.kernel.org/doc/man-pages/。