早些时间写了一个简单日志类,后来友人提示每次程序后台启动时总是日志不能按时间创建新日志文件,后来分析发现日志对象在主线程中是这么调用的,
class Log
{
void createThread()
{
pthread_create(id, null,threadFun, this);
}
static void *threadFunction(void *arg)
{
run();
}
}
int main()
{
Log* o = new Log()
o->createThread();
daemon(1, 0);
}
后来看了daemon()函数实现才明白,原来daemon函数先将标准输出都重定位的/dev/null,再fork出子进程,并且exit(父进程),系统文档这么说的(Thisfunction forks, and if the fork(2) succeeds, the parent calls_exit(2), so that further errors are seen by the child only.)而我的createThread()是在daemon之前调用,创建出来的子线程的父线程已经exit了,所有run()最后根本没有调用直接退出了。将其改到daemon(1,0)之后再运行日志对象则一切正常了。感觉友人提示。呵呵。。。。
再附一段deamon函数大致实现
int daemon( intnochdir, int noclose )
{
pid_t pid;
if ( !nochdir&& chdir("/") != 0 )//如果nochdir=0,那么改变到"/"根目录
return -1;
if ( !noclose) //如果没有noclose标志
{
intfd = open("/dev/null", O_RDWR);
if(fd < 0)
return-1;
dup(fd, 0);
dup(fd, 1);
dup(fd, 2);
close(fd);
}
pid =fork(); //创建子进程.
if(pid < 0) //失败
return-1;
if (pid >0)
_exit(0);//返回执行的是父进程,那么父进程退出,让子进程变成真正的孤儿进程.
//创建的 daemon子进程执行到这里了
if (setsid() < 0) //创建新的会话,并使得子进程成为新会话的领头进程
return-1;
return0; //成功创建daemon子进程
}
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请
点击举报。