linux进程关系
概要
- 进程可以属于同一个进程组,多个进程组组成一个会话
- 进程组和会话只要用于实现job controller,比如bash的
ls &
,表示创建一个background进程组
示意图
| ---------------- ---------------- |
| | pid1, pid2, ...| | pid3, pid4, ...| |
| pgrp1 | (forground) | ,pgrp2 | (backgroud) |, ... |
| ---------------- ---------------- |
session1 | |, session2(同session1, 省略)
----------------------------------------------------------------
pgrp
- shell和systemd启动的进程,pgid和sid都是进程本身,进程启动之后,它的子进程将继承父进程的pgid和sid
- getpgid获取pgid,setpgid设置pgid
- pid等于pgid的进程,被称为pgrp leader
- 信号可以发给一个进程,或者一个进程组
- wait可以等待某个子进程,也可以等待某个进程组
session
- 多个pgrp组成一个session
- setsid()创建创建会话的进程被称为session leader
- 每个session有一个controlling terminal(tty或者pts),当有controlling terminal时,进程组分为foreground pgrp和background pgrp
- terminal相关的信号(如ctrl+C, ctrl+)会分发给foreground pgrp中的所有进程, 终端断开的SIGHUB信号会发给controlling process
- 如果session内的进程需要使用controlling terminal,直接open("/dev/tty")即可
- 可以使用tcgetpgrp获取foreground pgrp的pgid, 使用tcsetpgrp设置foreground pgrp
- 查看进程是否有controlling terminal, ps -o tpgid,如果为-1,则表示没有controlling terminal