电子产业一站式赋能平台

PCB联盟网

搜索
查看: 269|回复: 0
收起左侧

Linux进程关系

[复制链接]

1001

主题

1001

帖子

8805

积分

高级会员

Rank: 5Rank: 5

积分
8805
发表于 2024-11-20 08:00:00 | 显示全部楼层 |阅读模式

c3qhvl1f4gb64012788413.gif

c3qhvl1f4gb64012788413.gif
2 S  J( K( A- ?5 Z, n) w
点击上方蓝色字体,关注我们
6 U9 A, y( i9 t在 Linux 系统中,每个进程都拥有一个唯一的标识符,即进程号(PID,Process ID),并有其独特的生命周期。
! N) T' \4 @0 I) v# S9 y+ ]
& `: K: I3 c7 {( Z0 b每个进程都有一个父进程,而父进程也可能有更上一级的父进程,最终可以追溯到系统的根进程 init,形成一个进程家族树。: j1 q0 B1 L  E0 q! m
. |, k7 |4 d) k4 r! c
当子进程结束时,父进程能够接收子进程的终止通知,并获取其退出状态。
6 Z$ y0 N" c# X5 M6 ~* Z  `4 e
6 V$ f/ k7 @, o( |; u8 b- ~! G除此之外,Linux 系统中的进程之间还存在其他层次关系,如进程组和会话。. I7 E6 F! P' I0 g8 a
# A5 I5 i+ `! C. n, K
它们可以进一步拓展进程之间的关系,不仅局限于独立进程或父子进程关系,还包括进程组和会话等。+ n' B* @% L+ Z2 D* x+ c
1
5 b3 |" u* v: z" W6 l$ o' s; J4 G无关系
5 @* v) [, q5 K4 W- N, ]两个进程之间没有任何依赖关系,彼此独立运行,互不干扰。这类进程可以单独运行和终止,彼此之间没有任何联系。
( C  z0 {' y, G# L, R$ D20 W% k  x* D8 r, n. R' v
父子进程关系7 i. l" n0 Z2 D: k' Z, E! v
父子进程关系是通过 fork() 系统调用创建的。# O6 W# d& i5 R7 O0 `8 ^% c

9 M; G" k9 g7 b' C调用 fork() 的进程称为父进程,而被 fork() 创建出来的新进程称为子进程。父进程和子进程可以通过共享部分资源(如文件描述符)进行协作。- e' j2 {4 }8 F7 C- \- t
# I6 m8 ?. ^% c& M0 G
如果父进程在子进程之前终止,则子进程会被操作系统的 init 进程(PID 为 1)接管,此时 init 会成为其新的父进程,保证子进程的状态能够被处理。: k) H, }+ i; U8 g& B7 K9 n5 W) z
3
3 H/ f  t4 U5 y( u, i# @进程组+ [$ e9 {7 F$ t+ I! m' c
每个进程除了有自己的进程 ID(PID)和父进程 ID(PPID)外,还隶属于一个进程组,其进程组 ID(PGID)用来标识它所属的进程组。进程组是为了简化多个进程的管理。7 ^7 i! T  u. d( ]0 R  Z

5 {; q8 X/ \/ r4 X. s9 u# s. P例如,如果系统需要同时运行并管理多个相关进程,可以将它们归入同一个进程组,以便统一控制这些进程。
& T& k3 b% j. M- h: \进程组的特点:2 f& c% m5 R# w6 C
  • 每个进程必定隶属于某个进程组,且只能属于一个进程组。
  • 每个进程组有一个组长进程,其进程 ID 就是进程组的 PGID。
  • 通过在组长进程的 ID 前加负号,可以对整个进程组执行操作。
  • 即使组长进程终止,只要组内仍有其他进程,该进程组依然存在。
  • 新创建的进程会继承其父进程的进程组 ID,除非显式改变。
    * H" O) p2 x& H) [9 S; ~

      G" ^" J4 @; z3 B, u
    2 J& c- N, j' G. `0 r6 q
    获取进程组 ID:通过 getpgrp() 和 getpgid() 系统调用,用户可以获取进程的进程组 ID:2 t8 L8 i7 C, t* h6 r: m

    * y  s" R7 k8 g- @) O5 b; v- ~7 b
  • pid_t getpgid(pid_t pid);  // 获取指定进程的进程组 IDpid_t getpgrp(void);       // 获取调用进程的进程组 ID
    8 v! [* P! U2 V: g' a' t/ g& Ggetpgrp() 等价于 getpgid(0),即获取调用进程的进程组 ID。
      I. `) c9 A: h, z9 [" N4 `$ u' s+ S! T/ ]
    设置进程组 ID:通过 setpgid() 系统调用,可以为某个进程设置新的进程组:/ q1 D5 f) S7 E8 l
    9 o2 @% ]# f- s& X. S" N' h2 Z" A
  • int setpgid(pid_t pid, pid_t pgid);
    # I. w+ m; y& N& z* N# s0 C" gsetpgid(pid, pgid) 将 pid 指定的进程加入 pgid 进程组。+ z3 F) m( z# J- u  {

    & f6 Y2 @3 W9 psetpgrp() 是 setpgid(0, 0) 的简写,用于创建一个新的进程组。* X8 y$ u" f$ Y2 g5 X& p
    4
    # Y) `  ~$ D; q0 n' b- ]1 _会话
    + d' l5 t4 v; N( b" A! K会话是进程管理的另一层结构,包含一个或多个进程组。, G) V5 `4 N9 C/ K
    ) G, r! o& d8 V' |

    lie1mxzuadk64012788513.png

    lie1mxzuadk64012788513.png
    7 D: Q1 J" @7 x  A* U# |
    - Y6 g$ m, i" _! F5 ~7 C
    会话与进程组之间的关系如下:
    ; j# o" @. n9 U" p  g& v
  • 一个会话可以包含多个进程组。
  • 每个会话只能有一个前台进程组,其它进程组则为后台进程组。
  • 会话的首领是创建该会话的进程,且会话首领也作为新的进程组的组长。0 {! Z5 O7 p* F% j. ]3 y# T8 I
    & G+ d+ I6 K: F6 X/ w( }" F
    当用户在某个终端登录时,系统会创建一个新的会话。
    % V1 R, w) u$ f5 f. M/ s5 P0 \0 ?! F; g( D
    此时,前台进程组中的进程可以接受来自终端的输入和信号,比如 Ctrl + C 产生的 SIGINT 信号。
    . U  x7 C( P, R$ E( j/ ]" Q1 z4 E0 e5 x7 G0 C! n4 G. o) D
    获取会话 ID:通过 getsid() 系统调用可以获取某个进程的会话 ID:
    ( P  ^8 g; q- e$ q  \+ K3 \# Z" N) x& k
  • pid_t getsid(pid_t pid);( K$ _) `& a4 \+ ]8 f
    如果参数 pid 为 0,则返回调用进程的会话 ID。
    ( c4 Y" V* I. n' p
    # b- r0 C1 p4 `# K8 N3 \' v创建新会话:通过 setsid() 系统调用,当前进程可以创建一个新的会话,并成为该会话的会话首领和新的进程组组长:1 P! e/ s+ ^  a
    $ A# u# W& \* d  Y* l
  • pid_t setsid(void);
    : g; C2 \7 @! `调用成功后,setsid() 返回新的会话 ID。
    9 J3 y- q3 f, b9 a0 c7 [
    ) E8 l8 t9 w. e# S# ^Linux 系统通过进程 ID、父子进程关系、进程组和会话等层次结构,提供了灵活的进程管理方式。
    + m+ T2 j! r" ]7 q" ]* d. G6 @  i# I, Y' c
    进程组简化了对多个相关进程的管理,而会话机制则在多终端、多用户环境下起着重要作用。4 B2 l1 g: ]9 q' g2 R$ H: N
      T! m" X9 k  i0 a  m8 |& u
    通过系统调用,用户可以精确控制这些进程关系,以实现复杂的进程管理任务。
    8 P9 C" v* T4 b, i3 r

    jrltqu0qt2x64012788613.jpg

    jrltqu0qt2x64012788613.jpg

    8 u4 m3 [6 ^. y- T+ @; V+ @

    1bcap0inolm64012788713.gif

    1bcap0inolm64012788713.gif
    3 M0 d) y& ~( x3 R- M) c
    点击阅读原文,更精彩~
  • 回复

    使用道具 举报

    发表回复

    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则


    联系客服 关注微信 下载APP 返回顶部 返回列表