Linux之進程組、守護進程

轉自:https://blog.csdn.net/happiness_llz/article/details/82749105

 

進程組
概念和特性
進程組,也稱之爲作業。BSD於1980年前後向Unix中增加的一個新特性。代表一個或多個進程的集合。每個進程都屬於一個進程組。在waitpid函數和kill函數的參數中都曾使用到。操作系統設計的進程組的概念,是爲了簡化對多個進程的管理。

當父進程,創建子進程的時候,默認子進程與父進程屬於同一進程組。進程組ID==第一個進程ID(組長進程)。所以,組長進程標識:其進程組ID==其進程ID 

可以使用kill -SIGKILL -進程組ID(負的)來將整個進程組內的進程全部殺死。 【kill_multprocess.c】

組長進程可以創建一個進程組,創建該進程組中的進程,然後終止。只要進程組中有一個進程存在,進程組就存在,與組長進程是否終止無關。

進程組生存期:進程組創建到最後一個進程離開(終止或轉移到另一個進程組)。

一個進程可以爲自己或子進程設置進程組ID

進程組操作函數
getpgrp函數

獲取當前進程的進程組ID

pid_t getpgrp(void); 總是返回調用者的進程組ID

getpgid函數

獲取指定進程的進程組ID

pid_t getpgid(pid_t pid);  成功:0;失敗:-1,設置errno

如果pid = 0,那麼該函數作用和getpgrp一樣。

練習:查看進程對應的進程組ID 【getpgid.c】

setpgid函數

改變進程默認所屬的進程組。通常可用來加入一個現有的進程組或創建一個新進程組。

int setpgid(pid_t pid, pid_t pgid); 成功:0;失敗:-1,設置errno

將參1對應的進程,加入參2對應的進程組中。

注意:

1. 如改變子進程爲新的組,應fork後,exec前。

2. 權級問題。非root進程只能改變自己創建的子進程,或有權限操作的進程

練習:修改子進程的進程組ID 【setpgid.c】

會話
創建會話
創建一個會話需要注意以下6點注意事項:

調用進程不能是進程組組長,該進程變成新會話首進程(session header)
該進程成爲一個新進程組的組長進程。
需有root權限(ubuntu不需要)
新會話丟棄原有的控制終端,該會話沒有控制終端
該調用進程是組長進程,則出錯返回
建立新會話時,先調用fork, 父進程終止,子進程調用setsid
getsid函數
獲取進程所屬的會話ID

pid_t getsid(pid_t pid); 成功:返回調用進程的會話ID;失敗:-1,設置errno

pid爲0表示察看當前進程session ID

ps ajx命令查看系統中的進程。參數a表示不僅列當前用戶的進程,也列出所有其他用戶的進程,參數x表示不僅列有控制終端的進程,也列出所有無控制終端的進程,參數j表示列出與作業控制相關的信息。

組長進程不能成爲新會話首進程,新會話首進程必定會成爲組長進程。

setsid函數
創建一個會話,並以自己的ID設置進程組ID,同時也是新會話的ID。

pid_t setsid(void);  成功:返回調用進程的會話ID;失敗:-1,設置errno

調用了setsid函數的進程,既是新的會長,也是新的組長。

練習:fork一個子進程,並使其創建一個新會話。查看進程組ID、會話ID前後變化 【session.c】

守護進程
Daemon(精靈)進程,是Linux中的後臺服務進程,通常獨立於控制終端並且週期性地執行某種任務或等待處理某些發生的事件。一般採用以d結尾的名字。

Linux後臺的一些系統服務進程,沒有控制終端,不能直接和用戶交互。不受用戶登錄、註銷的影響,一直在運行着,他們都是守護進程。如:預讀入緩輸出機制的實現;ftp服務器;nfs服務器等。

    創建守護進程,最關鍵的一步是調用setsid函數創建一個新的Session,併成爲Session Leader。

創建守護進程模型
創建子進程,父進程退出
所有工作在子進程中進行形式上脫離了控制終端

在子進程中創建新會話
setsid()函數

使子進程完全獨立出來,脫離控制

改變當前目錄爲根目錄
chdir()函數

防止佔用可卸載的文件系統

也可以換成其它路徑

重設文件權限掩碼
umask()函數

防止繼承的文件創建屏蔽字拒絕某些權限

增加守護進程靈活性

關閉文件描述符
繼承的打開文件不會用到,浪費系統資源,無法卸載

開始執行守護進程核心工作
守護進程退出處理程序模型 【mydaemond.c】
--------------------- 
作者:walkingLL 
來源:CSDN 
原文:https://blog.csdn.net/happiness_llz/article/details/82749105 
版權聲明:本文爲博主原創文章,轉載請附上博文鏈接!

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章