linux 进程关系

linux进程关系

概要

  1. 进程可以属于同一个进程组,多个进程组组成一个会话
  2. 进程组和会话只要用于实现job controller,比如bash的ls &,表示创建一个background进程组

示意图

            |         ----------------             ----------------          |  
            |        | pid1, pid2, ...|           | pid3, pid4, ...|         |
            | pgrp1  |   (forground) |    ,pgrp2 |    (backgroud) |, ...    |
            |         ----------------             ----------------          |
session1    |                                                                |, session2(同session1, 省略)
             ----------------------------------------------------------------

pgrp

  1. shell和systemd启动的进程,pgid和sid都是进程本身,进程启动之后,它的子进程将继承父进程的pgid和sid
  2. getpgid获取pgid,setpgid设置pgid
  3. pid等于pgid的进程,被称为pgrp leader
  4. 信号可以发给一个进程,或者一个进程组
  5. wait可以等待某个子进程,也可以等待某个进程组

session

  1. 多个pgrp组成一个session
  2. setsid()创建创建会话的进程被称为session leader
  3. 每个session有一个controlling terminal(tty或者pts),当有controlling terminal时,进程组分为foreground pgrp和background pgrp
  4. terminal相关的信号(如ctrl+C, ctrl+)会分发给foreground pgrp中的所有进程, 终端断开的SIGHUB信号会发给controlling process
  5. 如果session内的进程需要使用controlling terminal,直接open("/dev/tty")即可
  6. 可以使用tcgetpgrp获取foreground pgrp的pgid, 使用tcsetpgrp设置foreground pgrp
  7. 查看进程是否有controlling terminal, ps -o tpgid,如果为-1,则表示没有controlling terminal

猜你喜欢

转载自www.cnblogs.com/zhedan/p/12456054.html