守护进程的实现

6个步骤

步骤1:创建子进程,杀死父进程,目的是为了步骤2中调用setsid可以成功。

步骤2:创建新会话,并自任组长。目的是脱离控制终端

               会话组长调用 setsid 会失败,步骤1创建的子进程必然不是会话组长,

               这就保证了 setsid 可以成功。

步骤3:修改工作目录为根目录。

              当进程没有结束时,工作目录是不能卸载的,为了防止这种情况,

              把工作目录设为根目录。因为根目录一般是不用卸载的。

步骤4:修改文件权限掩码,很多情况下,守护进程会创建很多临时文件,

              出于安全性考虑,往往不希望这些文件被其他用户查看,这时可以

               使用 umask 函数修改文件权限,创建掩码的取值,以满足守护进程的要求。

步骤5:关闭标准输入输出

int daemon_me()
{
    int  fd;

    /* 步骤1: 创建子进程,杀死父进程 */
    switch (fork()) {
        case -1:
            return -1;

        case 0:
            break;

        default:
            exit(0);
    }

    /* 步骤2: 创建新会话,自任组长 */
    if (setsid() == -1) {
        return -1;
    }

    /* 步骤3: 修改工作目录 */
    chdir("/");

    /* 步骤4: 将文件权限掩码设为0 */
    umask(0);

    /* 步骤5: 关闭标准输入输出 */
    fd = open("/dev/null", O_RDWR);
    if (fd == -1) {
        return -1;
    }

    if (dup2(fd, STDIN_FILENO) == -1) {
        return -1;
    }

    if (dup2(fd, STDOUT_FILENO) == -1) {
        return -1;
    }

    if (dup2(fd, STDERR_FILENO) == -1) {
        return -1;
    }

    if (fd > STDERR_FILENO) {
        if (close(fd) == -1) {
            return -1;
        }
    }

    return 0;
}
 

猜你喜欢

转载自kenby.iteye.com/blog/1183586