Shell 的进程组 ID = 前台作业的进程组 ID?

Ron*_*nce 3 shell bash process

我从以下2个来源果断地得出结论,Shell的进程组ID =前台作业进程组ID。当后台作业被选择在前台运行时,是 shell 的进程组 ID 更改为前台作业的进程组 ID 还是相反?

1.

为了便于作业控制的用户界面的实现,操作系统维护了当前终端进程组 ID 的概念。此进程组的成员(进程组 ID 等于当前终端进程组 ID 的进程)接收键盘生成的信号,例如 SIGINT。据说这些进程在前台。后台进程是那些进程组 ID 与终端不同的进程;此类进程不受键盘生成信号的影响。(来源)

2.

UNIX.SE

添加:

$sleep 3000 &
$sleep 2000 &
$ps xao pid,ppid,pgid,sid,tty,comm | grep tty

PID     PPID    PGID    SID     TTY     COMMAND
1153    1135    1153    1153    tty1    bash
1173    1153    1173    1153    tty1    sleep
1189    1153    1189    1153    tty1    sleep
1219    1153    1219    1153    tty1    ps
1220    1153    1219    1153    tty1    grep
Run Code Online (Sandbox Code Playgroud)

Gil*_*il' 6

我从以下2个来源果断地得出结论,Shell的进程组ID =前台作业进程组ID。

您不应该这样做,因为您引用的两个来源都没有声称 shell 的 PGID 等于前台作业 PGID。

shell 的 PGID 不会改变。在终端中运行交互式 shell 的正常情况下,shell 位于其自己的进程组中,并且 shell 的 PGID 等于 shell 的 PID。

每个进程都有一个PGID。终端有一个关联的前台进程组 ID。根据定义,前台进程组是具有该 PGID 的进程组。

请注意,如果终端是由终端模拟器提供的,则这与终端模拟器进程的 PID 之间没有任何关系。如果您考虑完全由内核提供的硬件终端,这应该是显而易见的:在这种情况下没有终端仿真器进程。

终端关联的 PGID 可以由tcsetpgrp函数设置,shell 在前台启动外部程序时调用该函数,或者使用fg.