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

its*_*_me 92 process ps session

什么是会话领导者,因为ps -d它选择除了会话领导者之外的所有进程?

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)。)

我认为对于不是领导者的会话或流程组的成员没有特殊术语。

  • 注意:使用 `ps xao pid,ppid,pgid,sid,comm` 可以查看这些 ID。 (6认同)
  • 为什么人们不给出更多基于现实世界比较的说明性答案.. +1 (4认同)

Arc*_*ege 26

会话领导者是会话 id == 进程 id 的进程。这听起来很人为,但会话 ID 是由子进程继承的。UNIX/Linux 中的某些操作对进程会话进行操作,例如,在发送到 kill 系统调用或命令时否定进程 ID。最常见的用途是注销 shell。操作系统将发送kill -HUP -$$,它将向所有具有与 shell 相同会话 ID 的进程发送 SIGHUP(挂断)信号。当您拒绝某个进程时,该进程的会话 ID 会从 shell 更改,因此它不会响应挂断信号。这是成为守护进程的过程的一部分。

大多数从窗口管理器/图形环境调用的进程具有与启动程序之一相同的会话 ID。这允许操作系统kill -HUP -$$对所有程序执行相同的操作:例如您的浏览器、音乐播放器、libreoffice、IM 客户端等。这些进程不是会话领导者。

  • 我认为这个答案可能会混淆会话和进程组,因为“kill -123”用于向进程组发送信号;我不相信“kill”可以向会话发送信号。接下来,如果我正确地阅读了这个答案,“$$”将获取 shell 的 PID,在这种情况下“kill -$$”将向 shell 的进程组而不是 shell 的会话发送信号。 (3认同)

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 上,则执行相同的操作),并阅读有关进程组和会话的部分,看看您是否能解惑。

  • 作为一个linux新手,我听不懂你说的是什么。看来你也很困惑?但你可能有足够的知识来理解阿尔切的回答意味着什么。如果您这样做,您能更清楚地解释一下吗? (2认同)