了解后台进程和终端进程组 ID

了解后台进程和终端进程组 ID

我正在阅读有关作业控制的 bash 参考手册,发现这里(强调我的):

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

我正在尝试进行一些实验来证实这一点,但我没有得到我期望的结果。

我有两个正在运行的终端窗口(我的默认终端是zsh,我bash从那里运行,以防发生任何变化)。

“实验”的过程如下:

  1. 在终端A运行一个长进程,我选择ping -c 4000 google.com
  2. 在终端 B 中,检查pgid终端 A 中运行的 ping,应该与终端 A 相同
  3. 在终端 A 中发送暂停字符,现在 ping 应暂停并添加到终端 A 中的作业中
  4. 检查pgidping命令,应该与终端A不同。

要检查进程信息,我使用以下命令: ps -e --forest -o pid -o ppid -o comm -o pgid | grep -E 'bas|zsh|pin'

实际结果
在盯着 ping 之前

 287562  287551  |   \_ zsh      287562
 351151  287562  |   |   \_ bas  351151
 354401  287551  |   \_ zsh      354401
 354486  354401  |       \_ bas  354486

在前台盯着 ping 后:

 287562  287551  |   \_ zsh      287562
 351151  287562  |   |   \_ bas  351151
 354401  287551  |   \_ zsh      354401
 354486  354401  |       \_ bas  354486
 359864  354486  |          pin  359864 # shouldn't this be the same as bash above ?

发送挂起信号后:

 287562  287551  |   \_ zsh      287562
 351151  287562  |   |   \_ bas  351151
 354401  287551  |   \_ zsh      354401
 354486  354401  |       \_ bas  354486
 359864  354486  |          pin  359864 # shouldn't this change after moving to the background?

我的问题是:为什么ping没有pgid与其父终端相同的终端?
为什么pgid从前台移动到后台时 ping 没有变化?

相关内容