一个守护进程实例
void DaemonInit(void)
{
//LOG::INF("[ServerMeeting] 服务初始化.\n");
int pid;
//如果是父进程,结束父进程,子进程继续
if(pid=fork())
{
exit(0);
}
/*else if(pid<0) // 不可能进入
{
exit(1); //fork失败,退出
}*/
//是第一子进程,后台继续执行
setsid();//第一子进程成为新的会话组长和进程组长
//并与控制终端分离
if(pid=fork())
{
exit(0);//是第一子进程,结束第一子进程
}
/*else if(pid<0)
{
exit(1);//fork失败,退出
}*/
//关闭打开的文件描述符,保留标准输入(0),标准输出(1)和标准错误输出(2)
//还可以将这3文件通过dup2重定向:error=open("/tmp/error",O_WRONLY|O_CREAT, 0600); dup2(error,2); close(error); //in=open("/tmp/in",O_RDONLY|O_CREAT,0600); if(dup2(in,0)==-1) perror("in"); close(in); //out=open("/tmp/out",O_WRONLY|O_CREAT,0600);if(dup2(out,1)==-1) perror("out"); close(out);
for(int fd=3,fdtablesize=getdtablesize();fd <fdtablesize;fd++)
{
close(fd);
}
//重设文件创建掩模
umask(0);
//信号处理
signal(SIGTTOU,SIG_IGN);
signal(SIGTTIN,SIG_IGN);
signal(SIGTSTP,SIG_IGN);
signal(SIGHUP ,SIG_IGN);
signal(SIGTERM,SIG_IGN);
//设置系统参数
struct rlimit l = {0,0};
l.rlim_cur=65535;
l.rlim_max=65535;
setrlimit(RLIMIT_NOFILE,&l);
}