守护进程是一种生命周期较长的进程,它常在系统自举时开始,然后在系统关闭是结束。
#include"unpipc.h"
int main(){
int i,fd0,fd1,fd2;
pid_t pid;
struct rlimit rl;
struct sigaction sa;
umask(0);
if(getrlimit(RLIMIT_NOFILE,&rl)<0){
sys_err("getrlimit error");
}
if((pid=fork())<0){
sys_err("fork error");
}else if(pid!=0){
exit(0);
}
setsid();
sa.sa_handler=SIG_IGN;
sigemptyset(&sa.sa_mask);
if(sigaction(SIGHUP,&sa,NULL)<0){
sys_err("sigaction error");
}
if((pid=fork())<0){
sys_err("fork error");
}else if(pid!=0){
exit(0);
}
if(chdir("/")<0){
sys_err("chdir error");
}
if(rl.rlim_max==RLIM_INFINITY){
rl.rlim_max=1024;
}
for(i=0;i<rl.rlim_max;i++){
close(i);
}
fd0=open("/dev/null",O_RDWR);
fd1=dup(fd0);
fd2=dup(fd1);
if(fd0!=0||fd1!=1||fd2!=2){
sys_err("dup error");
}
}