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);
}