什么是会话领导者,其中ps -d
选择除会话领导者之外的所有进程?
答案1
在 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 退出时可以轻松杀死 shell 的子级。 (看退出(3)了解血淋淋的细节。)
我认为没有一个特殊术语来形容会话或流程组中不是领导者的成员。
答案2
会话领导者是一个会话 id == 进程 id 的进程。这听起来很做作,但会话 ID 是由子进程继承的。 UNIX/Linux 中的某些操作对进程会话进行操作,例如,在发送到终止系统调用或命令时否定进程 ID。最常见的用途是退出 shell 时。操作系统将发送kill -HUP -$$
,这将向SIGHUP
与 shell 具有相同会话 ID 的所有进程发送(挂断)信号。当您取消某个进程时,该进程的会话 ID 会从 shell 更改,因此它不会响应挂断信号。这是成为守护进程的进程的一部分。
大多数从窗口管理器/图形环境调用的进程与启动程序之一具有相同的会话 ID。这允许操作系统kill -HUP -$$
对所有程序执行相同的操作:例如浏览器、音乐播放器、Libre Office、IM 客户端等。这些进程不是会话领导者。
答案3
我以为我知道这个问题的答案,但我编写了一个 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;
}
我用cc -g -o sid sid.c
几种不同的方式编译了它,看看会发生什么:
./sid
nohup ./sid > sid.out
setsid ./sid
Linux (2.6.39) 的返回结果让我有点惊讶。我还找到了手册页第 7 节“凭据”。
我的建议是man 7 credentials
(或者如果不是在 Linux 上则等效),并阅读有关进程组和会话的部分,看看您是否能解决这个问题。