本文內容:
1.守護進程的定義
2.守護進程的作用
3.守護進程的創建過程
一.守護進程的定義
1.守護進程是脫離於終端並且在后台運行的進程
2.守護進程脫離終端是為了避免在執行過程中的信息在任何終端上顯示,並且不被任何終端產生的終端信息所打斷
3.守護進程通常在系統引導裝入時啟動
二.守護進程的作用
1.守護進程是一個生存周期較長的進程,通常獨立於控制終端並且周期性的執行某種任務或者等待處理某些待發生的事件
2.大多數服務都是通過守護進程實現的
3.關閉終端,相應的進程都會被關閉,而守護進程卻能夠突破這種限制
三.守護進程的創建過程
背景知識:
1. 進程組:一個或多個進程的集合,進程組由進程組ID標識,進程組長的進程ID和進程組ID一致,並且進程組ID不會由於進程組長的退出而受到影響
2. 會話周期:一個或多個進程組的集合,比如用戶從登陸到退出,這個期間用戶運行的所有進程都屬於該會話周期
3.setsid函數:創建一個新會話,並擔任該會話組的組長,調用setsid函數的目的:讓進程擺脫原會話,原進程組,原終端的控制
創建守護進程的過程:
1.創建子進程,父進程退出
子進程變成孤兒進程,然后由1號init進程收養
2.子進程創建新會話
調用setsid創建新的會話,擺脫原會話,原進程組,原終端的控制,自己成為新會話的組長
3.將當前目錄改為根目錄
正在運行的進程文件系統不能卸載,如果目錄要回退,則此時進程不能做到,為了避免這種麻煩,以根目錄為當前目錄
4.重設文件權限掩碼
子進程的文件權限掩碼是復制的父進程的,不重新設置的話,會給子進程使用文件帶來諸多麻煩
5.關閉不需要的文件描述符
子進程的文件描述符也是從父進程復制來的,那些不需要的文件描述符永遠不會被守護進程使用,會白白的浪費系統資源,還可能導致文件系統無法結束
樣例程序:守護線程每隔100s就向文件寫入一句話
#include <iostream> #include<pthread.h> #include<stdio.h> #include<stdlib.h> #include<string.h> #include<unistd.h> #include<errno.h> #include<semaphore.h> #include<sys/wait.h> #include<sys/types.h> #include<fcntl.h> #include<sys/stat.h> using namespace std; #define max_file 65535 int main() { pid_t pc; int fd,len; char buf[]="this is a demo\n"; len=strlen(buf); pc=fork();//第一步,創建子進程 if(pc<0) { cout<<"fork error"<<endl; exit(1); } else if(pc>0) { exit(0);//第二步,父進程退出 } else { setsid();//第三步,創建新會話 chdir("/");//第四步,將當前目錄改為根目錄 umask(0);//第五步,重新設置文件權限掩碼 for(int i=0; i<max_file; i++) { close(i);//第六步,關閉不需要的文件描述符 } while(1) { if((fd=open("/tmp/dameo.log",O_CREAT|O_WRONLY|O_APPEND,0600))<0) { cout<<"open erro"<<endl; exit(1); } write(fd,buf,len+1); close(fd); sleep(100);//每隔100s輸出一句話到文件 } } }