1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46
| 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 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);
}
} |