+ -
当前位置:首页 → 问答吧 → uclibc daemon 源码 求解,看不懂,

uclibc daemon 源码 求解,看不懂,

时间:2011-08-08

来源:互联网

C/C++ code

int daemon( int nochdir, int noclose )
{
    int fd;

    switch (fork()) {
        case -1:
            return(-1);
        case 0:
            break;
        default:
            _exit(0);
    }

    if (setsid() == -1)
        return(-1);

    /* Make certain we are not a session leader, or else we
     * might reacquire a controlling terminal */
    if (fork())
        _exit(0);

    if (!nochdir)
        chdir("/");

    if (!noclose && (fd = open(_PATH_DEVNULL, O_RDWR, 0)) != -1) {
        dup2(fd, STDIN_FILENO);
        dup2(fd, STDOUT_FILENO);
        dup2(fd, STDERR_FILENO);
        if (fd > 2)
            close(fd);
    }
    return(0);
}




中途为什么要 fork 2次,一次不行吗?

作者: sundl2268   发布时间: 2011-08-08


  1、首先是程序运行后调用fork,并让父进程退出。子进程获得一个新的进程ID,但继承了父进程的进程组ID。
  2、调用setsid创建一个新的session,使自己成为新session和新进程组的leader,并使进程没有控制终端(tty)。
  进程已经成为无终端的会话组长,但它可以重新申请打开一个新的控制终端。可以通过不再让进程成为会 话组长的方式来禁止进程重新打开控制终端,需要再次调用fork函数。
  3、改变当前工作目录至根目录,以免影响可加载文件系统。或者也可以改变到某些特定的目录。
  4、设置文件创建mask为0,避免创建文件时权限的影响。
  5、关闭不需要的打开文件描述符。因为Daemon程序在后台执行,不需要于终端交互,通常就关闭STDIN、STDOUT和STDERR。其它根据实际情况处理。

作者: zmlovelx   发布时间: 2011-08-09

引用 1 楼 zmlovelx 的回复:
  1、首先是程序运行后调用fork,并让父进程退出。子进程获得一个新的进程ID,但继承了父进程的进程组ID。
  2、调用setsid创建一个新的session,使自己成为新session和新进程组的leader,并使进程没有控制终端(tty)。
进程已经成为无终端的会话组长,但它可以重新申请打开一个新的控制终端。可以通过不再让进程成为会 话组长的方式来禁止进程重新打开控制终端,需要再次……


顶一下

作者: yong_f   发布时间: 2011-08-09