首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 其他教程 > 互联网 >

看护进程的实现

2012-09-01 
守护进程的实现6个步骤?步骤1:创建子进程,杀死父进程,目的是为了步骤2中调用setsid可以成功。?步骤2:创建新

守护进程的实现

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;}
?

?

?

热点排行