cjm*_*cjm 96
在 Linux 中,每个进程都有几个与之关联的 ID,包括:
进程 ID (PID)
这是标识进程的任意数字。每个进程都有一个唯一的 ID,但是在进程退出并且父进程检索到退出状态后,进程 ID 被释放以供新进程重用。
父进程 ID (PPID)
这只是启动相关进程的进程的 PID。如果父进程在子进程之前退出,则子进程的 PPID 将更改为另一个进程(通常为 PID 1)。
进程组 ID (PGID)
这只是进程组领导的 PID。如果 PID == PGID,则该进程是进程组领导。
会话 ID (SID)
这只是会话领导者的 PID。如果 PID == SID,则此进程是会话领导者。
会话和进程组只是将多个相关进程视为一个单元的方式。一个进程组的所有成员总是属于同一个会话,但一个会话可能有多个进程组。
通常,shell 将是会话领导者,并且该 shell 执行的每个管道都是一个进程组。这是为了在退出时轻松杀死 shell 的孩子。(有关血腥的详细信息,请参阅出口(3)。)
我认为对于不是领导者的会话或流程组的成员没有特殊术语。
Arc*_*ege 26
会话领导者是会话 id == 进程 id 的进程。这听起来很人为,但会话 ID 是由子进程继承的。UNIX/Linux 中的某些操作对进程会话进行操作,例如,在发送到 kill 系统调用或命令时否定进程 ID。最常见的用途是注销 shell。操作系统将发送kill -HUP -$$,它将向所有具有与 shell 相同会话 ID 的进程发送 SIGHUP(挂断)信号。当您拒绝某个进程时,该进程的会话 ID 会从 shell 更改,因此它不会响应挂断信号。这是成为守护进程的过程的一部分。
大多数从窗口管理器/图形环境调用的进程具有与启动程序之一相同的会话 ID。这允许操作系统kill -HUP -$$对所有程序执行相同的操作:例如您的浏览器、音乐播放器、libreoffice、IM 客户端等。这些进程不是会话领导者。
Bru*_*ger 14
我以为我知道答案,但我写了一个 C 程序来解决这个问题。
#include <stdio.h>
#include <unistd.h>
int
main(int ac, char **av)
{
pid_t sid, mypid, pgid, gid;
mypid = getpid();
sid = getsid(0);
pgid = getpgid(0);
gid = getpgrp();
printf("PID %d\n", mypid);
printf("process group ID of session leader: %d\n", sid);
printf("process group ID: %d\n", pgid);
printf("process group ID: %d\n", gid);
if (!fork())
{
mypid = getpid();
sid = getsid(0);
pgid = getpgid(0);
gid = getpgrp();
printf("child PID %d\n", mypid);
printf("process group ID of session leader: %d\n", sid);
printf("process group ID: %d\n", pgid);
printf("process group ID: %d\n", gid);
_exit(0);
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我用cc -g -o sid sid.c 几种不同的方式编译它,看看会发生什么:
./sid
nohup ./sid > sid.out
setsid ./sid
Run Code Online (Sandbox Code Playgroud)
我对 Linux (2.6.39) 的回报感到有些惊讶。我还找到了第 7 节手册页“凭据”。
我的建议是这样做man 7 credentials(如果不是在 Linux 上,则执行相同的操作),并阅读有关进程组和会话的部分,看看您是否能解惑。