0

《unix环境高级编程》第13章关于守护进程的程序调用的一些代码的不理解
代码中有注释的段落即是,谢谢指导

void daemonize(const char* cmd){
    int i,fd0,fd1,fd2;
    pid_t pid;
    struct rlimit rl;
    struct sigaction sa;

    umask(0);

    if(getrlimit(RLIMIT_NOFILE,&rl)<0)
        err_quit("%s:can't get file limit ",cmd);

    if((pid=fork())<0)
        err_quit("%s:can't fork",cmd);
    else if(pid!=0)
        exit(0);
    setsid();
    sa.sa_handler=SIG_IGN;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags=0;
    if(sigaction(SIGHUP,&sa,NULL)<0)
        err_quit("%s:can't ignore SIGHUP",cmd);

    if((pid=fork())<0)
        err_quit("%s:can't fork",cmd);
    else if(pid!=0)
        exit(0);
    
    if(chdir("/")<0)    
        err_quit("%s:can't chidir to /",cmd);

    if(rl.rlim_max==RLIM_INFINITY)    
        rl.rlim_max=1024;
    for(i=0;i<rl.rlim_max;i++)
        close(i);

    //打开/dev/null使其具有文件描述符0,1,2?????
    fd0=open("/dev/null",O_RDWR);
    fd1=dup(0);
    fd2=dup(0);
    
    openlog(cmd,LOG_CONS,LOG_DAEMON);
    if(fd0!=0||fd1!=1||fd2!=2){
        syslog(LOG_ERR,"unexpect file descriptors %d %d %d ",fd0,fd1,fd2);
        exit(1);
    }
}
2019-06-14 提问
1 个回答
0

进程会默认打开 0 1 2 这 3 个描述符 用于标准输入输出,而

for(i=0;i<rl.rlim_max;i++)
    close(i);

会把打开的描述符全部关掉,上面说的 0 1 2 也就被关闭了。

又因为打开描述符时是从最低未使用的描述符开始,所以,这时候再打开文件,就应该就 0,后面的 2 个 dup 应该是 1 和 2

撰写答案

推广链接