打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
linux下daemon函数的理解

      早些时间写了一个简单日志类,后来友人提示每次程序后台启动时总是日志不能按时间创建新日志文件,后来分析发现日志对象在主线程中是这么调用的,

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子进程
}

本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
daemon函数的原理及使用详解
linux守护进程 编写要点
linux下怎么编写守护程序呢?
在linux上 重定向 管道实现 (转)
Linux 守护进程
linux进程基础
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服