进程组 (process group)
linux中每个进程都属于一个进程组。
-
当一个子进程被 fork() 创建出来后,默认和其父进程在一个进程组内。
int setpgid(pid_t pid, pid_t pgid); \* Set process group *\
作业 (job)
Unix shell使用*作业 (job) *这个概念来描述、记录一条命令行求值所创建的进程,每个shell进程维护着一个 job 相关的数据结构。
shell为每一个作业创建一个新进程组。假设当shell对命令求值创建一个进程 A ,shell为 A 创建一个作业。进程 A 可能调用 fork() 创建多个子进程,这几子个进程并不属于shell的某个作业,但他们和作业中 A 属于同一个进程组。由于A被 shell fork 创建,所以 A 默认的pgid和shell进程一样,故需shell修改 A 的 pgid ,随后 A 创建的子进程自然也在这个进程组中。
使用 CTRL + Z、CTRL + C 等为整个前台的进程组发送信号,而非只是属于前台作业的进程。
同一时刻只能有一个前台作业,若干个后台作业。若想创建后台作业需在输入的命令最后加一个'&'字符。
使用jobs内置命令查看当前所有作业。按下 ctrl+z 向可以使得前台进程组所有进程挂起。bg <jobid> 命令使一个前台进程组所有进程在后台运行,fg <jobid> 命令使一个前台进程组所有进程前台运行。