zoukankan      html  css  js  c++  java
  • Linux Daemon进程

    模型

    • 创建孤儿进程 fork()
    • 创建新的会话 setid()
    • 改变当前目录为根目录chdir()
    • 重设文件权限掩码umask()
    • 关闭文件描述符close()

    创建孤儿进程

    创建孤儿进程只需要将父进程关闭保留子进程

    pid_t pid_child=fork();
    if(0<pid_child){
        exit(0);
    }
    

    创建新的会话


    会话组是一个或多个进程组的集合,一个shell就是一个会话,可以分为前台进程组和后台进程组,每个进程组都有一个组长,组长进程的pid就是进程组的id,当一个会话结束的时候,依附于它的进程都会关闭
    setsid()函数用于创建一个新的会话,并使得当前进程成为新会话组组长,也就是说使进程完全独立出来,从而脱离所有其他进程的控制,但是setsid()不能在一个会话组长进程中被调用,所以我们先创建子进程,并使其成为孤儿进程,这样它就脱离了原来的会话,此时调用setsid可以使其成为一个新的会话的组长进程。当然,作为组长进程,虽然它脱离了原来的会话,失去了终端,满足了守护进程的需求,但是它完全可以自己再打开一个终端,所以我们有时会在准备好守护进程条件之后再fork一次创建孙进程,然后让子进程自杀,在孙进程中执行守护进程的代码,这样新的守护进程就不会开启自己的终端。

    pid_t pid;
    pid=setsid();
    

    改变当前目录为根目录

    守护进程的工作目录是不能被卸载的,选择根目录是个很好的方式,切换进程的工作目录可以使用chdir()

    chdir("");
    

    重设文件权限掩码

    文件权限掩码是指问家权限中被屏蔽掉的对应位,把文件权限掩码设置为0,可以增加该守护进程的灵活性,和$umask类似,设置进程的文件权限掩码的函数是umask()

    umask(0);   //将文件权限掩码设为0
    

    关闭文件描述符

    如果父进程中打开的文件时候没有指定"close-on-exec"选项,那么子进程会继承父进程的文件描述符,这些文件描述符在制作守护进程的时候需要将其关闭。一个进程打开的所有文件描述符都在该进程的文件描述符表中,这个表的大小可以使用函数gettablesize()来获得

    fdtablesize=gettablesize();
    for(fd=0;fd<fdtablesize;fd++){
        close(fd);
    }
    

    再次创建孤儿进程

    pid_t pid_gchild=fork();
    if(0<pid_gchild){
        exit(0);
    }
    //孙进程执行的代码
    
  • 相关阅读:
    用ASP.NET开发三层架构
    关于DataGrid模板列里的Checkbox全选个人总结
    javascript实现日期星期的显示
    在两个ASP.net页面之间传递值
    你有没有成为技术作家的潜力
    关于SharePoint 2007中的InfoPath Form Service的一点小问题
    关于MOSS SDK的Web Content Management
    [MOSS汇编SDK]Web Content Management:自定义页面的工具栏
    关于修改域用户密码的WebPart的问题的问题.
    [MOSS 译]如何:在WEB内容查询部件中使用自定义的字段
  • 原文地址:https://www.cnblogs.com/xiaojiang1025/p/6012006.html
Copyright © 2011-2022 走看看