当我的程序从 bash 启动时属于哪个进程组?

当我的程序从 bash 启动时属于哪个进程组?

如果我从 运行一个程序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是一个(前台)工作。和pscat在同一个进程组中,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

subshel​​l 是一项工作。子 shell 本身可以被视为非交互式 shell。

相关内容