linux/unix進程組及會話學習

傳統上,Unix操作系統下運行的應用程序、服務器以及其他程序都被稱爲進程,而Linux也繼承了來自unix進程的概念。必須要理解下,程序是指的存儲在存儲設備上(如磁盤)包含了可執行機器指令(二進制代碼)和數據的靜態實體;而進程可以認爲是已經被OS從磁盤加載到內存上的、動態的、可運行的指令與數據的集合,是在運行的動態實體。這裏指的指令和數據的集合可以理解爲Linux上ELF文件格式中的.text .data數據段。

那什麼是進程組呢?顧名思義,進程組就是一些進程的組合。這些進程並不是孤立的,他們彼此之間或者存在父子、兄弟關係,或者在功能上有相近的聯繫。

那爲啥Linux裏要有進程組呢?其實,提供進程組就是爲了方便對進程進行管理。假設要完成一個任務,需要同時併發100個進程。當用戶處於某種原因要終止這個任務時,要是沒有進程組,就需要手動的一個個去殺死這100個進程,並且必須要嚴格按照進程間父子兄弟關係順序,否則會擾亂進程樹。有了進程組,就可以將這100個進程設置爲一個進程組,它們共有1個組號(pgrp),並且有選取一個進程作爲組長(通常是“輩分”最高的那個,通常該進程的ID也就作爲進程組的ID)。現在就可以通過殺死整個進程組,來關閉這100個進程,並且是嚴格有序的。

進程必定屬於一個進程組,也只能屬於一個進程組。 一個進程組中可以包含多個進程。 進程組的生命週期從被創建開始,到其內所有進程終止或離開該組。

內核中,sys_getpgrp()系統調用用來獲取當前進程所在進程組號;sys_setpgid(int pid, int pgid)調用用來設置置頂進程pid的進程組號爲pgid。

 

再看下會話。由於Linux是多用戶多任務的分時系統,所以必須要支持多個用戶同時使用一個操作系統。當一個用戶登錄一次系統就形成一次會話。每個會話都有一個會話首領(leader),即創建會話的進程。一個會話可包含多個進程組,但只能有一個前臺進程組。

sys_setsid()調用能創建一個會話。必須注意的是,只有當前進程不是進程組的組長時,才能創建一個新的會話。調用setsid 之後,該進程成爲新會話的leader。


關於加入一個現有組或創建一個新進程組函數setpgid的理解。

原型

#include<unistd.h>

int setpgid(pid_t pid,pid_t pgid);

假設條件:pid1進程屬於pgid1進程組;pid2屬於pgid2進程組,並且是pgid2進程組組長;另有進程組pgid3,


     在pid1進程中調用setpgid(pid2,pgid3);
  
     a)當pid2和pgid3都>0且不相等時
        功能:將pid2進程加入到pgid3組。此時pid2進程脫離pgid2進程組,進入pgid3進程組。
     b)當pid2和pgid3都>0且相等時
        功能:pid2進程創建新進程組,成爲新進程組長(pgid3=pid2)。
     c)當pid2==0,pgid>0時
        功能:將調用進程pid1加入到pgid3中。此時pid1脫離pgid1,進入pgid3。
     d)當pid2>0,pgid==0時
        功能:將pid2加入到調用進程所在的pgid1進程組。此時pid2脫離pgid2,進入pgid1。
     e)當pid2和pgid3都==0時,返回錯誤。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章