守护进程:Linux实现转载

守护(daemon)进程即在后台运行的进程,网上有很多介绍守护进程的文章,这里不再赘述,直接上代码。

[cpp]  view plain copy print ?
  1. static void _daemon_prep(int stderr_log)  
  2. {  
  3.     /* Avoid keeping any directory in use. */  
  4.     chdir("/");  
  5.    
  6.     /* Reset process session id. */  
  7.     setsid();  
  8.       
  9.     /* If you want to log in console. */  
  10.     if (stderr_log)  
  11.         return;  
  12.   
  13.     /* 
  14.      * Close inherited file descriptors to avoid 
  15.      * keeping unnecessary references. 
  16.      */  
  17.     close(0);  
  18.     close(1);  
  19.     close(2);  
  20.   
  21.     /* 
  22.      * Redirect std{in,out,err}, just in case. 
  23.      */  
  24.     open("/dev/null", O_RDWR);  
  25.     dup(0);  
  26.     dup(0);  
  27. }  
  28.   
  29. static int _daemonize()  
  30. {  
  31.     int pid = fork();  
  32.     if (pid != 0) {  
  33.         // parent, exit  
  34.         if (pid == -1) {  
  35.             //cerr << "daemonize failed!" << endl;  
  36.             return -1;  
  37.         }  
  38.         exit(0);  
  39.     } else {  
  40.         // child, continue  
  41.         //cout << "daemonnize success!" << endl;  
  42.         _daemon_prep(0);  
  43.         return 0;  
  44.     }  
  45. }  

在你的 main 函数中调用 _daemonize 方法即可使你的进程变成守护进程。如以下示例:

[cpp]  view plain copy print ?
  1. int main()  
  2. {  
  3.     _daemonize();  
  4.        
  5.     while(1) {  
  6.         cout << "hello, world" << endl;  
  7.         sleep(1);  
  8.     }  
  9.       
  10.     exit(0);  
  11. }  

以上"hello, world"程序会在后台运行,因在_daemon_prep函数中将标准输入输出重定位到了/dev/null,故你在终端看不到任何输出。如你想在终端看到输出,可在调用_daemon_prep时传入参数1。如你想把标准输出、错误输出重定位到文件方便后续查看,可修改代码如下:

[cpp]  view plain copy print ?
  1. /* 
  2.  * Redirect std{in,out,err}, just in case. 
  3.  */  
  4. open("/dev/null", O_RDWR); // stdin  
  5. if (open("/var/log/yourapp.log", O_RDWR | O_CREAT | O_TRUNC) < 0 ) {  
  6.     cerr << "open error!" << endl;  
  7.     dup(0); // stdout  
  8.     dup(0); // stderr  
  9. else {  
  10.     dup(1); // redirect stderr to the file same as stdout  
  11. }  

你可能感兴趣的:(守护进程:Linux实现转载)