原理
一、setsid();
VFS 層系統調用
int sys_setsid(void)
{
...
current->leader = 1;
current->session = current->pgrd = current->pid;
current->tty = -1; //表示該領頭程序沒有控制終端。
}
說明:當程序是會話的領頭程序時setsid()調用失敗并傳回(-1)。setsid()調用成功後,傳回新的會話的ID,調用setsid函數的程序成為新的會話的領頭程序,并與其父程序的會話組和程序組脫離。由于會話對控制終端的獨占性,程序同時與控制終端脫離。
pid_t pid = fork(); //fork a process
if (pid < 0) exit(0); //fork error
if (pid > 0) exit(0); //father process exit
setsid();[1] //creat a new session for a process
//之前parent和child運作在同一個session裡,parent是會話(session)的領頭程序,
//parent程序作為會話的領頭程序,如果exit結束執行的話,那麼子程序會成為孤兒程序,并被init收養。
//執行setsid()之後,child将重新獲得一個新的會話(session)id。
//這時parent退出之後,将不會影響到child了。
二、umask 一般與 int open(const char *pathname, int flags, mode_t mode)合用
每個檔案都有權限,每新建立一個檔案就要指定檔案權限(mode &umask)
新建立的檔案pathname 的 檔案權限 = (umask & mode)
#include <fcntl.h>
int main()
int fd;
umask(0026);
fd = open("test.txt",O_RDWR | O_CREAT,0666);
if(fd < 0)
perror("open");
return 0;
檔案權限結果為 666 - 26 = 640 = rw-r-----
三、getdtablesize ()
這個函數定義為__sysconf(open_max)形式,getdtablesize ()是傳回所在程序的檔案描述附表的項數,即該程序打開的檔案數目
四、什麼是linux的"重定向"???
Linux重定向是指修改原來預設的一些東西,對原來系統指令的預設執行方式進行改變,比如說簡單的我不想看到在顯示器的輸出而是希望輸出到某一檔案中就可以通過Linux重定向來進行這項工作。
實驗步驟
守護程序編寫的主要步驟如下:
1) 将程式進入背景執行。由于守護程序最終脫離控制終端,到背景去運作。方法是在程序中調用 fork 使父程序終止,讓 Daemon 在子程序中背景執行。這就是常說的“脫殼”。子程序繼續函數 fork()的定義如
下:pid_t fork(void);
2) 脫離控制終端、登入會話和程序組。開發人員如果要擺脫它們,不受它們的影響,一般使用 setsid() 設定新會話的領頭程序,并與原來的登入會話和程序組脫離。
3) 禁止程序重新打開控制終端。
4) 重設檔案權限掩碼
5) 關閉打開的檔案描述符,并重定向标準輸入、标準輸出和标準錯誤輸出的檔案描述符。程序從建立它的父程序那裡繼承了打開的檔案描述符。如果不關閉,将會浪費系統資源,引起無法預料的錯誤。關
閉三者的代碼如下:for (fd = 0, fdtablesize = getdtablesize(); fd < fdtablesize; fd++) close(fd);
6) 改變工作目錄到根目錄或特定目錄程序活動時,其工作目錄所在的檔案系統不能卸下守護程序執行個體包括兩部分:主程式 test.c 和初始化程式 init.c。主程式每隔一分鐘向/tmp 目錄中的日志test.log 報告運作狀态。初始化程式中的 init_daemon 函數負責生成守護程序。讀者可以利用 init_daemon函數生成自己的守護程序。
實驗代碼