linux的會話、進程、進程組等概念


1.一些縮寫

PID = 進程ID (由內核根據延遲重用算法生成)
PPID = 父進程ID(只能由內核修改)
PGID = 進程組ID(子進程、父進程都能修改)
SID = 會話ID(進程自身可以修改,但有限制,詳見下文)
TPGID= 控制終端進程組ID(由控制終端修改,用於指示當前前台進程組)

2.關於進程、進程組、會話之前的關系

總體關系:

進程屬於一個進程組,進程組屬於一個會話,會話可能有也可能沒有控制終端

 

 

一個或多個進程的集合,進程組屬於一個會話。fork()並不改變進程組ID。

進程組組長:
PID與PGID相等的進程。組長可以改變子進程的進程組ID,使其轉移到另一進程組。
例如一個shell進程(下文均以bash為例),當使用管道線時,如echo "hello" | cat,bash以第一個命令的進程ID為該管道線內所有進程設置進程組ID。此時echo和cat的進程組ID都設置成echo的進程ID。
前台進程組
該進程組中的進程能夠向終端設備進行讀、寫操作的進程組。
登陸shell(例如bash)通過調用tcsetpgrp()函數設置前台進程組,該函數將終端設備的fd(文件描述符)與指定進程組關聯。成為前台進程組的進程其TPGID=PGID,常常可以通過比較他們來判斷前后台進程組。
后台進程組
一個會話中,除前台進程組、會話首進程以外的所有進程組。該進程組中的進程能夠向終端設備寫,但是當試圖讀終端設備時,將會收到SIGTTIN信號,並停止。登錄shell可以根據設置在終端上發出一條消息[1]通知用戶有進程欲求讀終端。
前台進程組ID只能有一個,而后台進程組同時可存在多個。后台進程組的PGID≠TPGID。
組長進程:
  組長進程標識: 其進程組ID==其進程ID
  組長進程可以創建一個進程組,創建該進程組中的進程,然后終止
  只要進程組中有一個進程存在,進程組就存在,與組長進程是否終止無關
  進程組生存期: 進程組創建到最后一個進程離開(終止或轉移到另一個進程組)
建立新會話:setsid()函數
  該調用進程是組長進程,則出錯返回
    先調用fork, 父進程終止,子進程調用
  該調用進程不是組長進程,則創建一個新會話
    •該進程變成新會話首進程(session header)
    •該進程成為一個新進程組的組長進程。
    •該進程沒有控制終端,如果之前有,則會被中斷
組長進程不能成為新會話首進程,新會話首進程必定會成為組長進程...

3.僵死進程與孤兒進程
僵屍進程:先於父進程終止,但是父進程沒有對其進行善后處理(獲取終止子進程有關信息,釋放它仍占有的資源)。消滅僵屍進程的唯一方法是終止其父進程。
孤兒進程:該進程的父進程先於自身終止。其特點是PPID=1(init進程的ID)。一個孤兒進程可以自成孤兒進程組。
孤兒進程組:
定義1
該組中的每個成員的父進程要么是該組的一個成員,要么不是該組所屬會話的成員
定義2
不是孤兒進程組的條件是,該組中有一個進程,其父進程屬於同一會話的另一個組中。
也就是說,將該父進程終止就能使該進程組成為孤兒進程(感謝網友”hello”的指正)。這個父進程通常是這個進程組的組長進程,因為只有它的父進程在這個進程組外,而其他進程(組長的子進程)的父進程都是組長進程的ID
————————————————
版權聲明:本文為CSDN博主「湯的Blog」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/tangli555/article/details/52027377

喜歡這篇文章?歡迎打賞~~

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM