「Learning Linux Kernel」- 进程

“session leaders” in `ps`

What are “session leaders” in `ps`?
CSDN/The Linux Process Principle, PID、PGID、PPID、SID、TID、TTY

在 Linux 中,每个进程都有若干相关的”数值“:

PID,进程号

用于标识进程的任意数值。每个进程都具有唯一的进程号,在进程退出后且父进程检索退出状态后,会释放进程号以留作新进程使用。

PPID,父进程号

启动进程的进程的进程号。

PGID,进程组号

每个进程都属于某个进程组(Process Group),在每个进程组中可以包含多个进程。每个进程组都会有一个领导进程(Process Group Leader),领导进程的进程号为进程组号,以识别进程组。领导进程可以先退出,但是进程组依然存在,并具有相同的进程组号,直到在进程组中的最后一个进程结束。进程组简化进程操作,可以以组为单位进行管理。

SID,会话号

在Shell支持作业控制(Job Control)的前提下,多个进程组还可以构成单个会话。(1)每个会话有单个或多个进程组组成,可以存在单个领头进程,也可以没有。(2)会话领导进程的进程号会识别为会话号。(3)在会话中的进程组称为作业(Job)。(4)会话可以有一个进程组成为会话的前台作业(Foreground Job),而其他的进程组是后台工作(Background Job)。(5)每个会话可以连接一个控制终端(Control Terminal)。当控制终端有输入输出时,都传递给该会话的前台进程组。由终端产生的信号,比如CTRL+Z、CTRL+C等等,会传递到前台进程组。(6)会话的意义在于将多个作业(进程组)囊括在一个终端,并取其中某个作业作为前台,来直接接收该终端的输入输出以及终端信号,其他作业在后台运行。

会话与进程组只是将相关进程作为管理单元的方式。在进程组里的所有成员总是属于相同会话,但是单个会话中可能有多个进程组。

通常,Shell是单个会话领导,由该Shell执行的管道将是进程组。这便于在退出时结束Shell的子进程。

RGID and EGID, PGID and SGID

GID, current, primary, supplementary, effective and real group IDs?

在 Linux 中:(1)每个用户都具有组号,分为主要组号(Primary Group ID)与附属组号(Supplementary Group ID);(2)每个进程具有所属的用户组号,分为实际组号(Real Group ID)与有效组号(Effective Group ID)。这是两个概念:

PGID 与 SGID 与用户相关,用于控制用户权限。前者是用户主要组号,每个用户属于某个主要组。后者是用户的附属组号,每个用户可以属于多个附属组。

RGID 与 EGID 与进程相关,用于控制进程权限。前者是进程实际组号,在运行程序时,程序以当前用户特权运行。此时实际组号就是当前用户的主要组号。当进程需要作为其他组成员执行任务时,可以使用 setgid 函数切换有效组号。

RUID and EUID

Difference between owner/root and RUID/EUID
在 Linux 中,每个进程都具有所属的用户号,分为实际用户号(Real User ID)与有效用户号(Effective User ID):

RUID,实际用户号,基本是不会变得。当 User A 登录后,有它运行的进程,将使用 User A 的实际用户号作为进程实际用户号。

EUID,有效用户号,与 setuid 位有关。当文件具有 setuid 位时,在运行程序后,进程的将使用有效用户号。

实际用户号(RUID)及实际组号(RGID),有效用户号(EUID)及有效组号(EGID)

Linux进程的实际用户号和有效用户号

(这段内容与前面的有些重复,但是说的是相同的概念)

实际用户号和实际用户组号:标识我是谁(据说这是一个变态的哲学问题,难死一片哲学家),也就是登录用户的uid和gid,比如我的Linux以simon登录,在Linux运行的所有的命令的实际用户号都是simon的uid,实际用户组号都是simon的gid(可以用id命令查看)。

有效用户号和有效用户组号:进程用来决定我们对资源的访问权限。一般情况下,有效用户号等于实际用户号,有效用户组号等于实际用户组号。当文件设置 setuid 位时,则有效用户号等于文件的所有者的用户号,而不是实际用户号;当文件设置 setgid 位时,则有效用户组号等于文件所有者的组号,而不是实际用户组号。

总结(非技术)

一般情况下,但凡是”实际的“(Real)都是不太会变化的、原始既有的属性。而”有效的“(Effective)都是会变化的、当前正在使用的属性。