• 守护进程的两种实现


    直接上代码了,参考unix环境高级编程

     1 void daemon()
     2 {
     3     struct rlimit rl;
     4     umask(0);
     5     pid_t pid ;
     6     pid = fork();
     7     if(pid <0 )
     8     {
     9         perror("fork error");
    10         return 0;
    11     }
    12     if(pid > 0) /* parent */
    13     {
    14         exit(0);
    15     }
    16     else /* child */
    17     {
    18         /*
    19          * 在关闭描述符之前仍旧可以使用标准输入,标准输出
    20          */
    21         setsid();
    22         getrlimit(RLIMIT_NOFILE,&rl);
    23         printf("the max file num is %d: 
    ",rl.rlim_max);/*setsid()已经与控制终端分离*/
    24         printf("the max file num is %d: 
    ",RLIM_INFINITY);
    25         if(rl.rlim_max == RLIM_INFINITY)
    26             rl.rlim_max = 1024;
    27 
    28         int i ;
    29         for(i=0; i<rl.rlim_max; i++)
    30             close(i);
    31         int fd0, fd1, fd2;
    32         fd0 = open("/dev/null",O_RDWR);
    33         fd1 = dup(0);
    34         fd2 = dup(0);
    35         openlog("hello", LOG_CONS, LOG_DAEMON);
    36     }
    37 }

    有些喜欢在上述基础之上再fork一次,因为上述的子进程是整个回话的首进程,回话首进程有机会获取控制终端,daemon使不能和终端相连的,所以再fork一下,第一个子进程(第一次fork产生的进程)退出,最新的子进程(第二次fork产生的进程)就不是回话首进程就没有资格获取回去控制终端。

    有些还处理SIGHUP信号,关于SIGHUP信号请看unix环境高级编程

    第二种方法:

    直接利用linux提供的函数daemon()

    1 #include <unistd.h>
    2 
    3 int main()
    4 {
    5     daemon(0,0);
    6     while(1){  /* 不会马上结束 */
    7 
    8     }
    9 }

    ok...

  • 相关阅读:
    统计 (Standard IO)
    存储过程中的错误处理
    簡單SQL存儲過程實例
    SQLSERVER存储过程基本语法
    SQL Server游标的使用【转】
    实现业务系统中的用户权限管理--实现篇
    实现业务系统中的用户权限管理--设计篇
    C#.net 微信公众账号接口开发
    jquery select radio
    asp.net Repeater使用例子,包括分页
  • 原文地址:https://www.cnblogs.com/cdwodm/p/5023940.html
Copyright © 2020-2023  润新知