int Daemon(char* szExecName = NULL)
{
int res = 0;
pid_t pc;
pc = fork();
if(pc < 0)
{
fprintf(stderr,"ERROR_Deamon()_fork(): failed!");
return -1;
}
else if(pc == 0) //sub process
{
}
else if(pc > 0) //parent process
{
fprintf(stderr,"parent process exit!/n");
sleep(2);
exit(0);
}
res = setsid();
if(res == -1)
{
fprintf(stderr,"ERROR_Deamon()_setsid(): errno = %d/n", errno);
return -1;
}
if(pc=fork())
exit(0);//是第一子进程,结束第一子进程
else if(pc< 0)
exit(1);//fork失败,退出
//是第二子进程,继续
//第二子进程不再是会话组长
// for maybe its path is not current path when run.
char szModulePath[MAX_PATH] = {0};
GetModuleFileName(szExecName, szModulePath, sizeof(szModulePath));
res = chdir(szModulePath);
if(res == -1)
{
fprintf(stderr,"ERROR_Deamon()_chdir(): path = %s, errno = %d/n", szModulePath, errno);
return -1;
}
umask(0);
//for(int i = 0; i < MAXFILE; i++)
// {
//close(i);
//}
return 0;
}Dstlen)
*szTmp = '/0';
return i;
}
1.获取程序运行的绝对路径
int GetModuleFileName(char* sModuleName, char* sModulePath, int nSize)
{
int ret = -1;
char* p = getenv("_");
if(p != NULL && strstr(p, sModuleName) != NULL)
{
realpath(p, sModulePath);
char* p = strrchr(sModulePath, '/');
p[1] = '/0';
ret = 0;
}
else
{
realpath(sModuleName, sModulePath);
char* p = strrchr(sModuleP/');
p[1] = '/0';
ret = 0;
}
return ret;
}