我正在阅读有关作业控制的 bash 参考手册,发现这里(强调我的):
为了便于实现作业控制的用户界面,操作系统维护当前终端进程组ID的概念。该进程组的成员(进程组 ID 等于当前终端进程组 ID 的进程)接收键盘生成的信号,例如 SIGINT。这些过程据说在前台。后台进程是指进程组ID与终端进程组ID不同的进程;
我正在尝试进行一些实验来证实这一点,但我没有得到我期望的结果。
我有两个正在运行的终端窗口(我的默认终端是zsh
,我bash
从那里运行,以防发生任何变化)。
“实验”的过程如下:
- 在终端A运行一个长进程,我选择
ping -c 4000 google.com
- 在终端 B 中,检查
pgid
终端 A 中运行的 ping,应该与终端 A 相同 - 在终端 A 中发送暂停字符,现在 ping 应暂停并添加到终端 A 中的作业中
- 检查
pgid
ping命令,应该与终端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 没有变化?