電子產(chǎn)業(yè)一站式賦能平臺(tái)

PCB聯(lián)盟網(wǎng)

搜索
查看: 61|回復(fù): 0
收起左側(cè)

Linux進(jìn)程關(guān)系

[復(fù)制鏈接]

660

主題

660

帖子

4567

積分

四級(jí)會(huì)員

Rank: 4

積分
4567
跳轉(zhuǎn)到指定樓層
樓主
發(fā)表于 2024-11-20 08:00:00 | 只看該作者 |只看大圖 回帖獎(jiǎng)勵(lì) |倒序?yàn)g覽 |閱讀模式

6 B; A; _% J% `; J  \點(diǎn)擊上方藍(lán)色字體,關(guān)注我們
6 H% R7 A7 A' d7 \2 f, j7 |在 Linux 系統(tǒng)中,每個(gè)進(jìn)程都擁有一個(gè)唯一的標(biāo)識(shí)符,即進(jìn)程號(hào)(PID,Process ID),并有其獨(dú)特的生命周期。/ I' p/ g6 }4 D/ d
4 Y% L. X# ]* `& O7 t: d
每個(gè)進(jìn)程都有一個(gè)父進(jìn)程,而父進(jìn)程也可能有更上一級(jí)的父進(jìn)程,最終可以追溯到系統(tǒng)的根進(jìn)程 init,形成一個(gè)進(jìn)程家族樹。3 }  p2 P9 ^' R, B2 t

0 [7 y- x7 H# ~當(dāng)子進(jìn)程結(jié)束時(shí),父進(jìn)程能夠接收子進(jìn)程的終止通知,并獲取其退出狀態(tài)。
2 P0 G; S1 A' T' G4 O1 L0 A+ A' y: n  D, r1 c6 B
除此之外,Linux 系統(tǒng)中的進(jìn)程之間還存在其他層次關(guān)系,如進(jìn)程組和會(huì)話。: W- x1 }2 K1 Q% l- n! `. v, V( O) k! q
/ H7 \# D6 ]: i4 G0 \) _
它們可以進(jìn)一步拓展進(jìn)程之間的關(guān)系,不僅局限于獨(dú)立進(jìn)程或父子進(jìn)程關(guān)系,還包括進(jìn)程組和會(huì)話等。
7 r' ]1 L9 y+ a& ?- w1
- l( h) R* a4 s, w無關(guān)系
/ n+ O- g4 S, e( L$ C. Z! s兩個(gè)進(jìn)程之間沒有任何依賴關(guān)系,彼此獨(dú)立運(yùn)行,互不干擾。這類進(jìn)程可以單獨(dú)運(yùn)行和終止,彼此之間沒有任何聯(lián)系。- H) A% j: b  y$ g: a4 o0 C
2' v7 q1 W. K. t8 X' O- ^2 F
父子進(jìn)程關(guān)系2 N" x& u9 a- k' h
父子進(jìn)程關(guān)系是通過 fork() 系統(tǒng)調(diào)用創(chuàng)建的。. }" F) i: ?! N3 R5 Q/ }
& \1 A  c* w! q0 b1 F- ]" ~% j
調(diào)用 fork() 的進(jìn)程稱為父進(jìn)程,而被 fork() 創(chuàng)建出來的新進(jìn)程稱為子進(jìn)程。父進(jìn)程和子進(jìn)程可以通過共享部分資源(如文件描述符)進(jìn)行協(xié)作。1 e! d+ O/ E! D3 B1 m4 Y* L# h
* R1 ~/ k8 f0 @
如果父進(jìn)程在子進(jìn)程之前終止,則子進(jìn)程會(huì)被操作系統(tǒng)的 init 進(jìn)程(PID 為 1)接管,此時(shí) init 會(huì)成為其新的父進(jìn)程,保證子進(jìn)程的狀態(tài)能夠被處理。
/ D* p0 \: R  L) L2 L, S4 h6 |3  a9 g8 X4 x2 ]' Y; N
進(jìn)程組; Y0 j+ ]6 y% c+ Q5 [
每個(gè)進(jìn)程除了有自己的進(jìn)程 ID(PID)和父進(jìn)程 ID(PPID)外,還隸屬于一個(gè)進(jìn)程組,其進(jìn)程組 ID(PGID)用來標(biāo)識(shí)它所屬的進(jìn)程組。進(jìn)程組是為了簡化多個(gè)進(jìn)程的管理。
& |' t. q& `6 g7 k7 k/ H% R5 L4 T- k2 ]& c
例如,如果系統(tǒng)需要同時(shí)運(yùn)行并管理多個(gè)相關(guān)進(jìn)程,可以將它們歸入同一個(gè)進(jìn)程組,以便統(tǒng)一控制這些進(jìn)程。
; K3 Z+ P# t" f4 K5 }進(jìn)程組的特點(diǎn):, K9 Q2 H2 Q4 I7 X4 h6 g! @; ?
  • 每個(gè)進(jìn)程必定隸屬于某個(gè)進(jìn)程組,且只能屬于一個(gè)進(jìn)程組。
  • 每個(gè)進(jìn)程組有一個(gè)組長進(jìn)程,其進(jìn)程 ID 就是進(jìn)程組的 PGID。
  • 通過在組長進(jìn)程的 ID 前加負(fù)號(hào),可以對(duì)整個(gè)進(jìn)程組執(zhí)行操作。
  • 即使組長進(jìn)程終止,只要組內(nèi)仍有其他進(jìn)程,該進(jìn)程組依然存在。
  • 新創(chuàng)建的進(jìn)程會(huì)繼承其父進(jìn)程的進(jìn)程組 ID,除非顯式改變。6 v. j" ?6 M. ]
    # [0 b1 e9 n# p& p- R
    8 S# L) }% |9 u! [$ M
    獲取進(jìn)程組 ID:通過 getpgrp() 和 getpgid() 系統(tǒng)調(diào)用,用戶可以獲取進(jìn)程的進(jìn)程組 ID:1 x& S' L) J3 H. j2 ]- _: N

    ( F6 A/ v5 K/ w% Z2 n& L
  • pid_t getpgid(pid_t pid);  // 獲取指定進(jìn)程的進(jìn)程組 IDpid_t getpgrp(void);       // 獲取調(diào)用進(jìn)程的進(jìn)程組 ID3 c1 V# |& I; p) l) g" p: k
    getpgrp() 等價(jià)于 getpgid(0),即獲取調(diào)用進(jìn)程的進(jìn)程組 ID。 # n6 c4 c8 X+ `* \: P# g8 U1 i) f3 \

    9 _! m1 N/ i/ t設(shè)置進(jìn)程組 ID:通過 setpgid() 系統(tǒng)調(diào)用,可以為某個(gè)進(jìn)程設(shè)置新的進(jìn)程組:" ~' M5 }, v# ~1 T" q; n! N
    ' r7 Z, d5 }3 N6 T8 f* _1 s  a2 E
  • int setpgid(pid_t pid, pid_t pgid);
    " T+ D, ]. T* D- |" x' c& C1 Ksetpgid(pid, pgid) 將 pid 指定的進(jìn)程加入 pgid 進(jìn)程組。0 U2 Z4 a9 t9 k5 l! g# c
    : n) }0 b3 N" M6 Q5 R/ `
    setpgrp() 是 setpgid(0, 0) 的簡寫,用于創(chuàng)建一個(gè)新的進(jìn)程組。5 t! B7 n4 y- U4 a  }$ t4 R
    4# X- _4 j3 |4 V: u* x
    會(huì)話5 B" q3 p3 M( F$ H) M* J
    會(huì)話是進(jìn)程管理的另一層結(jié)構(gòu),包含一個(gè)或多個(gè)進(jìn)程組。
    % I$ k9 r9 m! H% O6 ^+ |; ?- q& O5 T
      d/ O3 P4 Q' b. l. ]# Y
    1 M6 o! y* i9 `! k" X) t8 L- U( R/ L- {- H1 z7 d' O& [! V3 Y' O% \
    會(huì)話與進(jìn)程組之間的關(guān)系如下:8 ^0 r, y/ A6 u' V, k; o  |
  • 一個(gè)會(huì)話可以包含多個(gè)進(jìn)程組。
  • 每個(gè)會(huì)話只能有一個(gè)前臺(tái)進(jìn)程組,其它進(jìn)程組則為后臺(tái)進(jìn)程組。
  • 會(huì)話的首領(lǐng)是創(chuàng)建該會(huì)話的進(jìn)程,且會(huì)話首領(lǐng)也作為新的進(jìn)程組的組長。6 I1 I; b1 J1 c9 G+ e- j. z

    0 B. O( H0 b' J& m$ n當(dāng)用戶在某個(gè)終端登錄時(shí),系統(tǒng)會(huì)創(chuàng)建一個(gè)新的會(huì)話。  I; _6 m# M1 Y1 H4 g
    % v& ~5 y$ N0 x2 k  M1 [
    此時(shí),前臺(tái)進(jìn)程組中的進(jìn)程可以接受來自終端的輸入和信號(hào),比如 Ctrl + C 產(chǎn)生的 SIGINT 信號(hào)。7 \9 \9 F( H' q4 F- X" k1 y

    * k+ P7 y9 {/ ]  C+ Z. U4 Z4 A獲取會(huì)話 ID:通過 getsid() 系統(tǒng)調(diào)用可以獲取某個(gè)進(jìn)程的會(huì)話 ID:9 n- ^) v) P: ?; b* n2 E) C. v

    - B4 L: ^6 l5 ]+ p
  • pid_t getsid(pid_t pid);8 a9 W7 `: g3 B6 m* v. {
    如果參數(shù) pid 為 0,則返回調(diào)用進(jìn)程的會(huì)話 ID。
    ' E, w. g' r. T6 o9 M+ G% }  r5 W- ]
    1 s$ I* U( A$ u( f9 e創(chuàng)建新會(huì)話:通過 setsid() 系統(tǒng)調(diào)用,當(dāng)前進(jìn)程可以創(chuàng)建一個(gè)新的會(huì)話,并成為該會(huì)話的會(huì)話首領(lǐng)和新的進(jìn)程組組長:7 c& s  P6 e3 u" w
    + C+ f1 K2 @+ w' h0 {! h, s
  • pid_t setsid(void);) i  k9 Z6 }) `/ l9 @2 {, _
    調(diào)用成功后,setsid() 返回新的會(huì)話 ID。
    6 W6 x2 H' b4 u& F
    & E, u3 e' y9 Y7 J; Q( I8 qLinux 系統(tǒng)通過進(jìn)程 ID、父子進(jìn)程關(guān)系、進(jìn)程組和會(huì)話等層次結(jié)構(gòu),提供了靈活的進(jìn)程管理方式。3 U0 V8 S+ X9 x/ U& o( j$ I( l

    4 `+ @5 F. L& V, Q" Z$ |/ J0 v進(jìn)程組簡化了對(duì)多個(gè)相關(guān)進(jìn)程的管理,而會(huì)話機(jī)制則在多終端、多用戶環(huán)境下起著重要作用。
    1 u5 R1 r: q! U( |" m' K) g
    * Z. K- m$ i1 d" ?: r. E# D通過系統(tǒng)調(diào)用,用戶可以精確控制這些進(jìn)程關(guān)系,以實(shí)現(xiàn)復(fù)雜的進(jìn)程管理任務(wù)。
    ; R; r! h0 W; _- d; [( R
    7 @6 R# D; @9 X, q5 R& D6 Q6 Z " [- q7 u! h. P1 W9 w* i8 H
    點(diǎn)擊閱讀原文,更精彩~
  • 發(fā)表回復(fù)

    本版積分規(guī)則


    聯(lián)系客服 關(guān)注微信 下載APP 返回頂部 返回列表