Linux 守護進程

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>關閉不再需要的文件描述符

舉例:

 

  1. #include<sys/types.h> 
  2. #include<sys/stat.h> 
  3. #include<signal.h> 
  4. #include<unistd.h> 
  5. #include<stdio.h> 
  6. #include<stdlib.h> 
  7.  
  8.  
  9.  
  10. #include<stdio.h> 
  11. #include<stdlib.h> 
  12. #include<sys/types.h> 
  13. #include<sys/stat.h> 
  14. #include<signal.h> 
  15. #include<fcntl.h> 
  16. #include <syslog.h> 
  17.  
  18. #define MAXF 10000 
  19. int main() 
  20. {    
  21.     int i,fd; 
  22.     pid_t pid; 
  23.  
  24.     pid=fork();/*<1> 創建子進程,結束父進程*/ 
  25.     if(pid<0) 
  26.              perror("fork error!\n"); 
  27.         else if(pid>0)/*父進程*/ 
  28.         exit(0); 
  29.  
  30.      
  31.     setsid();/*<2>創建會話期,進程成爲新的會話組長和新的進程組長*/ 
  32.     chdir("/");/*<3>更改當前工作目錄*/ 
  33.     umask(0);/*<4>設置文件權限*/ 
  34.     for(i=1;i<MAXF;i++)/*<5>關閉文件描述符*/ 
  35.     close(i); 
  36.      
  37.     /*每5秒,寫入文件一次*/ 
  38.  
  39.     while(1) 
  40.     { 
  41.         if((fd=open("/tmp/proc.log",O_CREAT|O_WRONLY|O_APPEND))<0) 
  42.              { 
  43.              perror("open error!\n"); 
  44.               exit(0); 
  45.              } 
  46.              write(fd,"Hi dameon!\n",12); 
  47.              close(fd); 
  48.         sleep(5);     
  49.     } 
  50.   
  51.      

結果:

cat命令查看/tmp/proc.log,每5秒會寫入一次 Hi dameon!

若要關閉此守護進程,使用ps -e查看,再kill關閉即可


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章