如果我从 运行一个程序bash
,那么我的程序与 shell 属于同一个进程组,还是属于一个新的进程组?
当我在做一个外壳时C,我需要处理SIGINT
信号。
现在Ctrl+向前台但属于同一进程组的进程C发送信号。SIGINT
我无法终止 bash 会话。
答案1
bash-4.3$ ps -j | cat
PID PGID SID TTY TIME CMD
4586 4586 4586 pts/1 00:00:00 bash
4600 4600 4586 pts/1 00:00:00 ps
4601 4600 4586 pts/1 00:00:00 cat
bash-4.3$ ps -j; ps -j
PID PGID SID TTY TIME CMD
4586 4586 4586 pts/1 00:00:00 bash
4602 4602 4586 pts/1 00:00:00 ps
PID PGID SID TTY TIME CMD
4586 4586 4586 pts/1 00:00:00 bash
4603 4603 4586 pts/1 00:00:00 ps
交互式外壳工作通过进程组来实现。这就是创建进程组的目的:运行交互式 shell 作业。交互式 shell 是唯一真正与进程组混合的命令。
上面ps -j | cat
是一个(前台)工作。和ps
都cat
在同一个进程组中,shell 使其成为终端的前台进程组,因此 a^C
会向它们发送 SIGINT。
在第二个示例中,有两个连续的作业。
在
bash-4.3$ (ps -j; ps -j)
PID PGID SID TTY TIME CMD
4586 4586 4586 pts/1 00:00:00 bash
4633 4633 4586 pts/1 00:00:00 bash
4634 4633 4586 pts/1 00:00:00 ps
PID PGID SID TTY TIME CMD
4586 4586 4586 pts/1 00:00:00 bash
4633 4633 4586 pts/1 00:00:00 bash
4635 4633 4586 pts/1 00:00:00 ps
subshell 是一项工作。子 shell 本身可以被视为非交互式 shell。