[进程组]
1. getpgrp(), getpgid(0) 可获取进程组id, 进程组长的pid等于pgid. 如果进程组长exit, 则进程组依旧存在, 组内其它进程的组ID仍然是之前的ID, 即不存在进程组长了.
2. fork()一个子进程后,子进程的组ID为父进程的组ID. 可以通过setpgid()来更改.
3. shell 中执行一个后台命令, 则会创建一个进程&进程组
4. shell 中执行一个前台命令, 则会创建一个进程&进程组, 如果有管道, 则所有的管道命令在同一个进程组
5. 一个终端所有的前后台进程组的进程都有一个session中, 拥有相同的session id. 通过setsid()可以创建一个无终端的新会话.
6. 从下图可以看到, bash的pid=pgid=sid, 显然bash就是一个session的头, 是bash提供了一个交互式的环境. 意即"终端退出" = "Session退出"
7. jobs不是一个可执行文件, 应该是bash内置的一个命令, bash在执行一个后台命令时,如&, 内部就会记录一个job. 所以jobs是bash的内部命令
whereis find, 输出如下:
whereis jobs, 输出如下:
可见jobs并不是一个bin,而是bash的内置变量. 它并不根据PGID来统计,而是根据提交给bash的后台命令.