Linux----網路程式設計(守護程序相關概念及程式設計流程)
阿新 • • 發佈:2018-12-17
一、守護程序的相關定義
守護程序:也稱為精靈程序,執行在後臺的一種特殊程序。守護程序獨立於控制終端並且週期性的執行某種任務或者等待處理髮生的事件。所以守護程序不因為使用者、終端或其他的變化而受影響。
守護程序的特點: 1. 執行週期長
2.在後臺執行
3.不與使用者互動
會話:一個或多個程序組的集合。使用者從登入到退出期間的所有程序都屬於一個會話期。會話id = 會話首程序的pid
程序組:一個或多個程序的集合。程序組的id=父程序的id。即父程序就是程序組長。
建立守護程序的必要性:開啟終端,執行的第一個程式為bash。若關閉終端,整個會話就會結束。為了防止會話意外結束或其他,可以建立一個新的會話。
建立新會話的條件:只能是普通的組員程序才可建立新會話。不能是會話首程序或程序組長。
二、守護程序的程式設計流程
1.fork() 建立子程序,退出父程序
- 使所有工作在子程序中進行,形式上脫離了控制終端。如果程序是以shell命令方式從前臺啟動,從父程序終止時,shell就認為命令已經完成。這可以自動使子程序在後臺執行。子程序繼承了父程序的程序組號,但它擁有自己的程序號。這就保證了此子程序不是程序組長。可以進行下一步建立新會話。
2.setsid() 在子程序中建立新會話
- 使子程序完全獨立出來,脫離控制。
3.fork() 退出父程序,失去程序組長身份
- 失去程序組長身份,稱為普通組員程序。第二次fork的目的是確保守護程序來即使開啟一個終端裝置,也不會自動獲得控制終端。
4.chdir("/") 改變當前工作路徑至根目錄下
- 防止佔用可解除安裝的檔案系統
5.umask(0) 將檔案掩碼清零
- 將檔案模式建立遮蔽字設定為0
- 拒絕某些許可權,增加守護程序靈活性
6.close() 關閉檔案描述符
關閉守護程序從執行它的程序(通常為shell)繼承而來開啟的檔案描述符。
程式碼如下:
#include <stdio.h> #include <string.h> #include <stdlib.h> #include <assert.h> #include <unistd.h> //建立守護程序 int main() { pid_t pid = fork(); //建立子程序,退出父程序 if(pid != 0) { exit(0); } setsid(); //建立一個新會話 pid = fork(); //退出父程序,失去程序組長身份 if(pid != 0) { exit(0); } chdir("/"); //改變當前工作目錄至根目錄下 umask(0); //檔案掩碼清零 int maxfd = getdtablesize(); int i = 0; for(; i<maxfd; i++) { close(i); } while(1) { FILE *fp = fopen("tmp/tiantian.log","a"); //fopen裡a表示追加 if(fp == NULL) { break; //建立失敗 } time_t t; time(&t); //獲取當前時間,從1970.1.1開始計算 fprintf(fp,"current time:%s",asctime(localtime(&t))); fclose(fp); sleep(5); } exit(0); }
執行命令:
cd /tmp 到根目錄tmp下
tail -f tiantian.log //五秒鐘重新整理一次
執行結果: