《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);
}
}
进程会默认打开 0 1 2 这 3 个描述符 用于标准输入输出,而
会把打开的描述符全部关掉,上面说的 0 1 2 也就被关闭了。
又因为打开描述符时是从最低未使用的描述符开始,所以,这时候再打开文件,就应该就 0,后面的 2 个 dup 应该是 1 和 2