`ps` 中的“会话领导者”是什么?

`ps` 中的“会话领导者”是什么?

什么是会话领导者,其中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 上则等效),并阅读有关进程组和会话的部分,看看您是否能解决这个问题。

相关内容