Chinaunix首页 | 论坛 | 博客
  • 博客访问: 418792
  • 博文数量: 86
  • 博客积分: 10
  • 博客等级: 民兵
  • 技术积分: 822
  • 用 户 组: 普通用户
  • 注册时间: 2012-12-25 10:36
文章分类

全部博文(86)

文章存档

2022年(1)

2021年(3)

2020年(1)

2019年(9)

2018年(24)

2017年(20)

2016年(20)

2015年(8)

我的朋友

分类: C/C++

2017-03-14 16:48:28

一、创建守护进的关键步骤:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. step 1.创建子进程,父进程退出  
  2. step 2.在子进程中创建新会话  
  3. step 3.改变当前目录为根目录  
  4. step 4.重设文件权限掩码  
  5. step 5.关闭文件描述符  


  实例说明:

[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #include <unistd.h>  
  2. #include <syslog.h>  
  3. #include <signal.h>  
  4. #include <stdlib.h>  
  5. #include <sys/types.h>  
  6.   
  7. #define MAXFD 64  
  8.   
  9. void demo_init()  
  10. {  
  11.     int i ;  
  12.         pid_t pid;  
  13.         if(pid = fork())//fork ,终止父进程  
  14.             exit(0);  
  15.         setsid();//为子进程创建新会话期,即摆脱原会话期、原进程组、原控制终端的控制  
  16.           
  17.         signal(SIGHUP, SIG_IGN);//父进程对子进程结束状态不感兴趣,忽略子进程结束信号SIG_IGN  
  18.           
  19.         chdir("/");// 将当前工作目录改为根目录  
  20.         umask(0); //文件权限全无   
  21.         for(i =0 ; i< MAXFD; i++)  
  22.         {  
  23.                 close(i);//关闭所有打开的文件,包括标准输入/出,错误输出  
  24.         }  
  25. }  
  26.   
  27. int  main()  
  28. {  
  29.         demo_init();  
  30.         while(1);  
  31. }  


二、Unbuntu  一个linux 守护 编程


先写一下小程序运行 , init_daemon:

复制代码
 1 #include   2 #include   3  4 int main()  5 {  6 daemon(0,0); // 将进程声明为守护进程  7  8 int i = 0 ;  9 while(1) 10  { 11 i++ ; 12 sleep(100000); 13  } 14 }
复制代码

编译,生成可执行文件: gcc -c init_daemon  

  gcc -o init_daemond init_daemon.o   ( 这里守护进程一般在文件后面加个d )

 生成的 执行文件拷贝到/usr/bin目录下

在/etc/init.d/ 下面写bash文件,注意这个文件名一定要与程序名一致 ,这里文件名为: init_daemond,创建后修改文件属性为 sudo chmod +x init_daemond  :


[html] view plain copy
 在CODE上查看代码片派生到我的代码片
  1. #! /bin/sh  
  2.   
  3. ### BEGIN INIT INFO  
  4. # Provides:              
  5. # Description:       A simple example for daemon app  
  6. ### END INIT INFO  
  7.   
  8.   
  9. if [ -f /etc/init.d/functions ]  
  10. then  
  11.     . /etc/init.d/functions  
  12. else  
  13.     . /lib/lsb/init-functions  
  14. fi  
  15.   
  16. NAME=Example_Daemond  
  17. DAEMON=/usr/bin/init_daemond  
  18. LOCKFILE=/var/lock/subsys/$DAEMON  
  19. PIDFILE=/var/run/$NAME.pid  
  20.   
  21. #start function   
  22. start(){  
  23.     echo -n "Starting daemon: "$NAME  
  24.     start-stop-daemon --start --quiet --pidfile $PIDFILE --exec $DAEMON  
  25.     echo "."  
  26. }  
  27. #stop function  
  28. stop(){  
  29.     echo "Stopping $DAEMON ..."  
  30.     if pidof $DAEMON > /dev/null; then  
  31.         killall -9 $DAEMON > /dev/null  
  32.         rm -rf $PIDFILE  
  33.         echo "Stop $DAEMON Success..."  
  34.     fi      
  35. }  
  36.   
  37.   
  38. #restart function  
  39. restart(){  
  40.     start  
  41.     stop  
  42. }  
  43.   
  44. #status function   
  45. status(){  
  46.     if pidof -o %PPID $DAEMON > /dev/null; then  
  47.              echo $NAME" is running..."  
  48.              exit 0  
  49.     else  
  50.              echo $NAME" is not running..."  
  51.              exit 1  
  52.     fi  
  53. }  
  54.   
  55.   
  56. case "$1" in  
  57. start)  
  58.     start  
  59.     ;;  
  60. stop)  
  61.     stop  
  62.     ;;  
  63. reload|restart)  
  64.     stop  
  65.     sleep 2  
  66.     start  
  67.     ;;  
  68. status)  
  69.     status  
  70.     ;;  
  71. *)  
  72.     echo $"Usage: $0 {start|stop|restart|status}"  
  73.     exit 1  
  74. esac  



 然后可以用service 命令启动守护进程:

1 service init_daemond start 2 service init_daemond stop 3 service init_daemond status

 

可以用ps -ef 命令来查看守护进程的运行

阅读(519) | 评论(0) | 转发(0) |
0

上一篇:common make

下一篇:linux 文件

给主人留下些什么吧!~~