1. 概述
守護進程(精靈進程)是一種生存期長的進程。
<1> 通常在系統引導裝入時啓動,在系統關閉時終止。
<2> 沒有控制終端,在後臺運行。
2 一些特徵
<1> 所有守護進程都以超級用戶(ROOT 用戶ID爲0)的優先權運行,
<2> 除update以外,所有守護進程都是進程組和會話期的首進程
<3> 所有守護進程的父進程都是init進程
3編程規則
<1>調用fork,結束父進程。
·若該守護進程由shell命令啓動,那麼父進程終止後,shell認爲命令結束,終端停止。
·子進程繼承父進程的進程組ID,使得子進程不是一個進程組的首進程。
<2>調用setsid創建一個新的會話期。
·使子進程成爲新會話期的首進程,
·成爲一個新進程組的首進程,
·沒有控制終端
<3>將當前工作目錄改爲系統根目錄
·當前工作目錄由父進程繼承而來
·若當前目錄在一個裝配文件系統中,則該文件系統不能被拆卸,因此需要更改當前目錄。
·也可當當前工作目錄修改爲其他目錄
<4>將文件方式創建屏蔽字設置爲0
·文件方式創建屏蔽字有父進程繼承的來
·此屏蔽可能會拒絕某些許可的創建,因此設置爲0
<5>關閉不再需要的文件描述符
舉例:
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<signal.h>
- #include<unistd.h>
- #include<stdio.h>
- #include<stdlib.h>
- #include<stdio.h>
- #include<stdlib.h>
- #include<sys/types.h>
- #include<sys/stat.h>
- #include<signal.h>
- #include<fcntl.h>
- #include <syslog.h>
- #define MAXF 10000
- int main()
- {
- int i,fd;
- pid_t pid;
- pid=fork();/*<1> 創建子進程,結束父進程*/
- if(pid<0)
- perror("fork error!\n");
- else if(pid>0)/*父進程*/
- exit(0);
- setsid();/*<2>創建會話期,進程成爲新的會話組長和新的進程組長*/
- chdir("/");/*<3>更改當前工作目錄*/
- umask(0);/*<4>設置文件權限*/
- for(i=1;i<MAXF;i++)/*<5>關閉文件描述符*/
- close(i);
- /*每5秒,寫入文件一次*/
- while(1)
- {
- if((fd=open("/tmp/proc.log",O_CREAT|O_WRONLY|O_APPEND))<0)
- {
- perror("open error!\n");
- exit(0);
- }
- write(fd,"Hi dameon!\n",12);
- close(fd);
- sleep(5);
- }
- }
結果:
cat命令查看/tmp/proc.log,每5秒會寫入一次 Hi dameon!
若要關閉此守護進程,使用ps -e查看,再kill關閉即可