天天看點

2程序之間的關系:程序組,會話,守護程序



1程序組

一個或多個程序的集合,程序組id是一個正整數。用來獲得目前程序組id的函數。

pid_t getpgid(pid_t pid)

pid_t getpgrp(void)

獲得父子程序程序組

2程式之間的關系:程式組,會話,守護程式

運作結果:

2程式之間的關系:程式組,會話,守護程式

組長程序辨別:其程序組id=其程序id

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

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

一個程序可以為自己或子程序設定程序組id

int setpgid(pid_tpid, pid_t pgid);

       如改變子程序為新的組,應在fork後,exec前使用

非root程序隻能改變自己建立的子程序,或有權限操作的程序

    setpgid()加入一個現有的程序組或建立一個新程序組,如改變父子程序為新的組

2程式之間的關系:程式組,會話,守護程式
2程式之間的關系:程式組,會話,守護程式

2會話

pid_t setsid(void);

a:調用程序不能是程序組組長,該程序變成新會話首程序(sessionheader)

b:該程序成為一個新程序組的組長程序。

c:需有root權限(ubuntu不需要)

d:新會話丢棄原有的控制終端,該會話沒有控制終端

e:該調用程序是組長程序,則出錯傳回

f:建立新會話時,先調用fork,父程序終止,子程序調用。

pid_t getsid(pid_t pid);

pid為0表示察看目前程序sessionid

ps ajx指令檢視系統中的程序。參數a表示不僅列目前使用者的程序,也列出所有其他用

戶的程序,參數x表示不僅列有控制終端的程序,也列出所有無控制終端的程序,參數j表示列出與作業控制相關的資訊。

組長程序不能成為新會話首程序,新會話首程序必定會成為組長程序。

2程式之間的關系:程式組,會話,守護程式

運作:

2程式之間的關系:程式組,會話,守護程式

另開一個終端。最開始輸入ps ajx,運作結果如下:

2程式之間的關系:程式組,會話,守護程式

稍等片刻後再次輸入ps ajx,運作結果如下:

2程式之間的關系:程式組,會話,守護程式

休眠20秒後此程序自動消失。

3守護程序

a概念

daemon(精靈)程序,是linux中的背景服務程序,生存期較長的程序,通常獨立于控制終端并且周期性地執行某種任務或等待處理某些發生的事件。

b模型

守護程序程式設計步驟

b1建立子程序,父程序退出

      所有工作在子程序中進行

    形式上脫離了控制終端

b2在子程序中建立新會話

  setsid()函數

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

b3改變目前目錄為根目錄

  chdir()函數

 防止占用可解除安裝的檔案系統

 也可以換成其它路徑

b4重設檔案權限掩碼

  umask()函數

 防止繼承的檔案建立屏蔽字拒絕某些權限

 增加守護程序靈活性

   b5關閉檔案描述符

      繼承的打開檔案不會用到,浪費系統資源,無法解除安裝

   b6開始執行守護程序核心工作

   b7守護程序退出處理

案例說明:

2程式之間的關系:程式組,會話,守護程式
2程式之間的關系:程式組,會話,守護程式

運作這個程式,它變成一個守護程序,不再和目前終端關聯。用ps指令看不到,必須運作帶x參數的ps指令才能看到。另外還可以看到,使用者關閉終端視窗或登出也不會影響守護程序的運作。

2程式之間的關系:程式組,會話,守護程式

繼續閱讀