天天看點

linux程序組長退出,有關linux--程序組、會話、守護程序詳解

程序組

一個或多個程序的集合

程序組ID: 正整數

兩個函數

getpgid(0)=getpgrp()

linux程式組長退出,有關linux--程式組、會話、守護程式詳解

eg:顯示子程序與父程序的程序組id

linux程式組長退出,有關linux--程式組、會話、守護程式詳解

#include 

#include 

#include 

main() {

pid_t pid;

((pid=fork())

printf();

}  (pid==) {

printf(,getpid());

printf(,getpgrp());

printf(,getpgid());

printf(,getpgid(getpid()));

exit();

}

sleep();

printf(,getpid());

printf(,getpgrp());

;

}

linux程式組長退出,有關linux--程式組、會話、守護程式詳解
linux程式組長退出,有關linux--程式組、會話、守護程式詳解

程序組id = 父程序id,即父程序為組長程序

組長程序

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

組長程序可以建立一個程序組,建立該程序組中的程序,然後終止

隻要程序組中有一個程序存在,程序組就存在,與組長程序是否終止無關

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

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

setpgid()加入一個現有的程序組或建立一個新程序組

linux程式組長退出,有關linux--程式組、會話、守護程式詳解

eg:父程序改變自身和子程序的組id

linux程式組長退出,有關linux--程式組、會話、守護程式詳解

#include 

#include 

#include 

main() {

pid_t pid;

((pid=fork())

printf();

exit();

}  (pid==) {

printf(,getpid());

printf(,getpgid());          sleep();

printf(,getpgid());

exit();

}

sleep();

setpgid(pid,pid);

sleep();

printf(,getpid());

printf(,getppid());

printf(,getpgid());

setpgid(getpid(),getppid());      printf(,getpgid());

;

}

linux程式組長退出,有關linux--程式組、會話、守護程式詳解
linux程式組長退出,有關linux--程式組、會話、守護程式詳解

會話: 一個或多個程序組的集合

開始于使用者登入

終止與使用者退出

此期間所有程序都屬于這個會話期

linux程式組長退出,有關linux--程式組、會話、守護程式詳解

建立新會話:setsid()函數

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

先調用fork, 父程序終止,子程序調用

該調用程序不是組長程序,則建立一個新會話

該程序變成新會話首程序(session header)

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

該程序沒有控制終端,如果之前有,則會被中斷

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

linux程式組長退出,有關linux--程式組、會話、守護程式詳解

會話ID:會話首程序的程序組ID

擷取會話ID: getsid()函數

linux程式組長退出,有關linux--程式組、會話、守護程式詳解
linux程式組長退出,有關linux--程式組、會話、守護程式詳解

#include 

#include 

#include 

main() {

pid_t pid;

((pid=fork())

printf();

exit();

}  (pid==) {

printf(,getpid());

printf(,getpgid());

printf(,getsid());

sleep();

setsid();          printf();

printf(,getpid());

printf(,getpgid());

printf(,getsid());

sleep();

exit();

}

;

}

linux程式組長退出,有關linux--程式組、會話、守護程式詳解
linux程式組長退出,有關linux--程式組、會話、守護程式詳解

在子程序中調用setsid()後,子程序成為新會話首程序,且成為一個組長程序,其程序組id等于會話id

守護程序

Linux大多數服務都是通過守護程序實作的,完成許多系統任務

0: 排程程序,稱為交換程序(swapper),核心一部分,系統程序

1: init程序, 核心調用,負責核心啟動後啟動Linux系統

沒有終端限制

讓某個程序不因為使用者、終端或者其他的變化而受到影響,那麼就必須把這個程序變成一個守護程序

守護程序程式設計步驟

1. 建立子程序,父程序退出

所有工作在子程序中進行

形式上脫離了控制終端

2. 在子程序中建立新會話

setsid()函數

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

3. 改變目前目錄為根目錄

chdir()函數

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

也可以換成其它路徑

4. 重設檔案權限掩碼

umask()函數

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

增加守護程序靈活性

5. 關閉檔案描述符

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

getdtablesize()

傳回所在程序的檔案描述符表的項數,即該程序打開的檔案數目

linux程式組長退出,有關linux--程式組、會話、守護程式詳解
linux程式組長退出,有關linux--程式組、會話、守護程式詳解

#include 

#include 

#include <.h>

#include 

#include 

#include 

#include 

main() {

pid_t pid;

i,fd;

*buf=;

((pid=fork())

printf();

exit();

}  (pid>)           exit();

setsid();         chdir();       umask();         (i=;i

() {           ((fd=open(,O_CREAT|O_WRONLY|O_APPEND,))

printf();

exit();

}

write(fd,buf,strlen(buf)+);

close(fd);

sleep();

printf();

}

;

}

linux程式組長退出,有關linux--程式組、會話、守護程式詳解

因為stdout被關掉了,是以“Never ouput!”不會輸出。

檢視/tmp/daemon.log,說明該程式一直在運作

linux程式組長退出,有關linux--程式組、會話、守護程式詳解

本文轉自:http://www.cnblogs.com/forstudy/archive/2012/04/03/2427683.html