程序組
一個或多個程序的集合
程序組ID: 正整數
兩個函數
getpgid(0)=getpgrp()
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5yN2gzM3QTOxEzMzAjMxAjMvwVM1cDM1MzLcJTMwIzLcNHa0FGcjlGcfd3Xw9CXt92YuM3ZvxmYuNmLyADMjlGcvw1LcpDc0RHaiojIsJye.png)
eg:顯示子程序與父程序的程序組id
#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());
;
}
程序組id = 父程序id,即父程序為組長程序
組長程序
組長程序辨別: 其程序組ID==其程序ID
組長程序可以建立一個程序組,建立該程序組中的程序,然後終止
隻要程序組中有一個程序存在,程序組就存在,與組長程序是否終止無關
程序組生存期: 程序組建立到最後一個程序離開(終止或轉移到另一個程序組)
一個程序可以為自己或子程序設定程序組ID
setpgid()加入一個現有的程序組或建立一個新程序組
eg:父程序改變自身和子程序的組id
#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());
;
}
會話: 一個或多個程序組的集合
開始于使用者登入
終止與使用者退出
此期間所有程序都屬于這個會話期
建立新會話:setsid()函數
該調用程序是組長程序,則出錯傳回
先調用fork, 父程序終止,子程序調用
該調用程序不是組長程序,則建立一個新會話
該程序變成新會話首程序(session header)
該程序成為一個新程序組的組長程序。
該程序沒有控制終端,如果之前有,則會被中斷
組長程序不能成為新會話首程序,新會話首程序必定會成為組長程序...
會話ID:會話首程序的程序組ID
擷取會話ID: getsid()函數
#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();
}
;
}
在子程序中調用setsid()後,子程序成為新會話首程序,且成為一個組長程序,其程序組id等于會話id
守護程序
Linux大多數服務都是通過守護程序實作的,完成許多系統任務
0: 排程程序,稱為交換程序(swapper),核心一部分,系統程序
1: init程序, 核心調用,負責核心啟動後啟動Linux系統
沒有終端限制
讓某個程序不因為使用者、終端或者其他的變化而受到影響,那麼就必須把這個程序變成一個守護程序
守護程序程式設計步驟
1. 建立子程序,父程序退出
所有工作在子程序中進行
形式上脫離了控制終端
2. 在子程序中建立新會話
setsid()函數
使子程序完全獨立出來,脫離控制
3. 改變目前目錄為根目錄
chdir()函數
防止占用可解除安裝的檔案系統
也可以換成其它路徑
4. 重設檔案權限掩碼
umask()函數
防止繼承的檔案建立屏蔽字拒絕某些權限
增加守護程序靈活性
5. 關閉檔案描述符
繼承的打開檔案不會用到,浪費系統資源,無法解除安裝
getdtablesize()
傳回所在程序的檔案描述符表的項數,即該程序打開的檔案數目
#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();
}
;
}
因為stdout被關掉了,是以“Never ouput!”不會輸出。
檢視/tmp/daemon.log,說明該程式一直在運作
本文轉自:http://www.cnblogs.com/forstudy/archive/2012/04/03/2427683.html