|
c3qhvl1f4gb64012788413.gif (60.41 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
c3qhvl1f4gb64012788413.gif
2024-11-23 22:07 上傳
! q3 ?! P6 g( [, k9 c+ @& x
點(diǎn)擊上方藍(lán)色字體,關(guān)注我們1 y- u) T1 |. \! `' N: T
在 Linux 系統(tǒng)中,每個(gè)進(jìn)程都擁有一個(gè)唯一的標(biāo)識(shí)符,即進(jìn)程號(hào)(PID,Process ID),并有其獨(dú)特的生命周期。( Q6 {( r$ Q& f8 J1 d
& m/ y( I* _3 Z a5 m! v3 h
每個(gè)進(jìn)程都有一個(gè)父進(jìn)程,而父進(jìn)程也可能有更上一級(jí)的父進(jìn)程,最終可以追溯到系統(tǒng)的根進(jìn)程 init,形成一個(gè)進(jìn)程家族樹。% ]; a8 ?+ u, [: z# L; A' G: q" l6 a
3 d" p m' L* H$ ^$ W6 g
當(dāng)子進(jìn)程結(jié)束時(shí),父進(jìn)程能夠接收子進(jìn)程的終止通知,并獲取其退出狀態(tài)。
" K+ A1 Q$ g$ ?! f& F/ F$ H8 R6 t7 [: W. ~: B6 U( h
除此之外,Linux 系統(tǒng)中的進(jìn)程之間還存在其他層次關(guān)系,如進(jìn)程組和會(huì)話。( ~/ e' N5 ~, r' }6 f3 I: S
+ n) k+ o v7 V8 [! _; |6 m它們可以進(jìn)一步拓展進(jìn)程之間的關(guān)系,不僅局限于獨(dú)立進(jìn)程或父子進(jìn)程關(guān)系,還包括進(jìn)程組和會(huì)話等。$ i: u7 `1 K! n; h1 u# W
13 ^2 e% E9 i+ S* ^; z
無(wú)關(guān)系
; {: v% X# Q( j0 x- S9 }0 X, u3 i兩個(gè)進(jìn)程之間沒有任何依賴關(guān)系,彼此獨(dú)立運(yùn)行,互不干擾。這類進(jìn)程可以單獨(dú)運(yùn)行和終止,彼此之間沒有任何聯(lián)系。
4 m8 d4 @+ ?; @1 Z/ E: |$ x" u1 i0 D E' I2/ l/ Z+ V6 n1 j' |% ?; f7 z; j( g
父子進(jìn)程關(guān)系; S% @1 [6 J: x9 M7 F
父子進(jìn)程關(guān)系是通過(guò) fork() 系統(tǒng)調(diào)用創(chuàng)建的。3 e- l* z! ~0 d1 r$ O- ? [" R
; Z+ a7 H1 X& X) b
調(diào)用 fork() 的進(jìn)程稱為父進(jìn)程,而被 fork() 創(chuàng)建出來(lái)的新進(jìn)程稱為子進(jìn)程。父進(jìn)程和子進(jìn)程可以通過(guò)共享部分資源(如文件描述符)進(jìn)行協(xié)作。2 U2 T+ g1 x, U1 T! V. V1 N$ @
" H0 S0 Q. M* \$ T7 F如果父進(jìn)程在子進(jìn)程之前終止,則子進(jìn)程會(huì)被操作系統(tǒng)的 init 進(jìn)程(PID 為 1)接管,此時(shí) init 會(huì)成為其新的父進(jìn)程,保證子進(jìn)程的狀態(tài)能夠被處理。
& o, Q9 r* ]6 m9 B3' P3 e& z. i. n) d2 N4 k6 I
進(jìn)程組
$ }2 j* P/ c( ]1 E ^每個(gè)進(jìn)程除了有自己的進(jìn)程 ID(PID)和父進(jìn)程 ID(PPID)外,還隸屬于一個(gè)進(jìn)程組,其進(jìn)程組 ID(PGID)用來(lái)標(biāo)識(shí)它所屬的進(jìn)程組。進(jìn)程組是為了簡(jiǎn)化多個(gè)進(jìn)程的管理。$ Q( p; h" S' M
/ {/ K$ x8 O6 ~7 ]例如,如果系統(tǒng)需要同時(shí)運(yùn)行并管理多個(gè)相關(guān)進(jìn)程,可以將它們歸入同一個(gè)進(jìn)程組,以便統(tǒng)一控制這些進(jìn)程。
- b+ G0 \& z% a* X3 u進(jìn)程組的特點(diǎn):
2 q# r9 F% V( v2 ~8 h9 a每個(gè)進(jìn)程必定隸屬于某個(gè)進(jìn)程組,且只能屬于一個(gè)進(jìn)程組。每個(gè)進(jìn)程組有一個(gè)組長(zhǎng)進(jìn)程,其進(jìn)程 ID 就是進(jìn)程組的 PGID。通過(guò)在組長(zhǎng)進(jìn)程的 ID 前加負(fù)號(hào),可以對(duì)整個(gè)進(jìn)程組執(zhí)行操作。即使組長(zhǎng)進(jìn)程終止,只要組內(nèi)仍有其他進(jìn)程,該進(jìn)程組依然存在。新創(chuàng)建的進(jìn)程會(huì)繼承其父進(jìn)程的進(jìn)程組 ID,除非顯式改變。8 s- M1 m& Z8 U+ F
6 U/ Q0 }. S, S3 W4 T. [. H Y& u" z2 S8 @5 y; K
獲取進(jìn)程組 ID:通過(guò) getpgrp() 和 getpgid() 系統(tǒng)調(diào)用,用戶可以獲取進(jìn)程的進(jìn)程組 ID:
" {5 ~" U" s4 z7 M' _8 y" ?
& O+ w0 m# U) a& npid_t getpgid(pid_t pid); // 獲取指定進(jìn)程的進(jìn)程組 IDpid_t getpgrp(void); // 獲取調(diào)用進(jìn)程的進(jìn)程組 ID
' M% h2 E2 R- B5 ?6 O. ?getpgrp() 等價(jià)于 getpgid(0),即獲取調(diào)用進(jìn)程的進(jìn)程組 ID。 2 g- V0 @& t9 M8 C1 m
' S9 Z+ v5 _8 C; l- G6 H; S% I設(shè)置進(jìn)程組 ID:通過(guò) setpgid() 系統(tǒng)調(diào)用,可以為某個(gè)進(jìn)程設(shè)置新的進(jìn)程組:
& b6 X, l( l4 `! t+ `6 n# R- E8 I% d0 a) {+ a5 V% H) t9 c
int setpgid(pid_t pid, pid_t pgid);+ b. v% h5 X* c: [9 X9 _ W
setpgid(pid, pgid) 將 pid 指定的進(jìn)程加入 pgid 進(jìn)程組。) m% O1 I9 v; W8 Z
3 q2 d5 X; Y: z0 K/ l* d: D/ p
setpgrp() 是 setpgid(0, 0) 的簡(jiǎn)寫,用于創(chuàng)建一個(gè)新的進(jìn)程組。
7 x# ^ N: B8 t9 j7 N) u% R4
, K% c* T# N, s3 r$ A# U& v! ?* v會(huì)話3 U+ F! {0 B% ^/ U
會(huì)話是進(jìn)程管理的另一層結(jié)構(gòu),包含一個(gè)或多個(gè)進(jìn)程組。
" z4 ]8 ?- P: t7 N& t/ {6 K/ h3 c: s. H5 C7 T! a- s
lie1mxzuadk64012788513.png (72.84 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
lie1mxzuadk64012788513.png
2024-11-23 22:07 上傳
, f) e" {: [8 G6 L2 [ o. R
/ g# j: ^8 M4 {/ t3 h( s
會(huì)話與進(jìn)程組之間的關(guān)系如下:) n, F- L) |$ B7 r( t2 u( Q
一個(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)程組的組長(zhǎng)。7 f1 w c! b6 y
" P! l" N |8 s" I k
當(dāng)用戶在某個(gè)終端登錄時(shí),系統(tǒng)會(huì)創(chuàng)建一個(gè)新的會(huì)話。! L) i4 K: O+ K+ G* Z: o
# G2 y! y7 q5 f8 ~4 c7 S, Y/ m
此時(shí),前臺(tái)進(jìn)程組中的進(jìn)程可以接受來(lái)自終端的輸入和信號(hào),比如 Ctrl + C 產(chǎn)生的 SIGINT 信號(hào)。
0 {! G! D3 x2 [( @% i/ ^7 G# C+ d" X
獲取會(huì)話 ID:通過(guò) getsid() 系統(tǒng)調(diào)用可以獲取某個(gè)進(jìn)程的會(huì)話 ID:
! i$ K4 ]2 ]7 a
% F$ a ~$ E) y" @+ Kpid_t getsid(pid_t pid);; R0 t0 U: k+ L7 _6 `+ [
如果參數(shù) pid 為 0,則返回調(diào)用進(jìn)程的會(huì)話 ID。( s& [. i; d7 g
* D5 m d {3 X# j# u4 g創(chuàng)建新會(huì)話:通過(guò) setsid() 系統(tǒng)調(diào)用,當(dāng)前進(jìn)程可以創(chuàng)建一個(gè)新的會(huì)話,并成為該會(huì)話的會(huì)話首領(lǐng)和新的進(jìn)程組組長(zhǎng):
+ j: p E2 `5 \( P. U
: |7 V% l0 x4 ~% spid_t setsid(void);
! r+ V S- v9 | C8 b7 D# j調(diào)用成功后,setsid() 返回新的會(huì)話 ID。
8 L0 F! d. s7 l# z! s; E
; T: F+ E' P# o. a2 s0 KLinux 系統(tǒng)通過(guò)進(jìn)程 ID、父子進(jìn)程關(guān)系、進(jìn)程組和會(huì)話等層次結(jié)構(gòu),提供了靈活的進(jìn)程管理方式。7 d* w5 v2 Y! b- J$ N" P
3 W4 r6 W, s' b6 Y5 k: Z
進(jìn)程組簡(jiǎn)化了對(duì)多個(gè)相關(guān)進(jìn)程的管理,而會(huì)話機(jī)制則在多終端、多用戶環(huán)境下起著重要作用。
9 B) ], w( i- {0 E! X e& {% ^( X5 n1 L0 c; z
通過(guò)系統(tǒng)調(diào)用,用戶可以精確控制這些進(jìn)程關(guān)系,以實(shí)現(xiàn)復(fù)雜的進(jìn)程管理任務(wù)。
. R9 F! s- o% F/ G; b6 c5 I4 l
jrltqu0qt2x64012788613.jpg (71.14 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
jrltqu0qt2x64012788613.jpg
2024-11-23 22:07 上傳
" u5 U, l! H+ A: ~6 Y
1bcap0inolm64012788713.gif (45.46 KB, 下載次數(shù): 0)
下載附件
保存到相冊(cè)
1bcap0inolm64012788713.gif
2024-11-23 22:07 上傳
8 c& S9 b( m' U W4 r! s3 |( e點(diǎn)擊閱讀原文,更精彩~ |
|