70,024
社区成员




//把进程初始化为Daemon,返回0或1说明main需要结束,返回0x80表示可继续.
int initDaemon(const char* lpcszMyName)
{
int i,pid,hFile;
char szFilename[108];
//第一次fork
pid = fork();
if (pid > 0) {
//父进程到此结束.
return 0;
}
if (pid < 0) {
//fork失败,退出.
return 1;
}
////////////////////////////////////
//只有第一子进程可以走到这里继续执行.
//第一子进程成为新的会话组长和进程组长.
setsid();
//第二次fork
pid = fork();
if (pid > 0) {
//第一子进程到此结束.
return 0;
}
if (pid < 0) {
//fork失败,退出.
return 1;
}
////////////////////////////////////
//只有第二子进程可以走到这里继续执行.
//与控制终端分离.
for (i = 0; i < NOFILE; i++) {
//关闭打开的文件描述符.
close(i);
}
//改变工作目录到/tmp防止无法卸载文件系统.
chdir("/tmp");
//重定向标准输出.
sprintf(szFilename, "/tmp/%s.out", lpcszMyName);
hFile = open(szFilename, O_WRONLY|O_CREAT|O_TRUNC, 0644);
if (hFile != -1) {
dup2(hFile, 1);//1号句柄代表标准输出设备.
close(hFile);
}
//重定向标准错误.
sprintf(szFilename, "/tmp/%s.err", lpcszMyName);
hFile = open(szFilename, O_WRONLY|O_CREAT|O_TRUNC, 0644);
if (hFile != -1) {
dup2(hFile, 2);//2号句柄代表标准错误设备.
close(hFile);
}
//重设文件创建掩码.
umask(0);
//处理SIGCHLD信号.
signal(SIGCHLD, SIG_IGN);
return 0x80;
}