创建守护进程 daemon

来源:互联网 发布:网络问政平台是什么 编辑:程序博客网 时间:2024/05/16 12:03

     在后台一直运行的进程为守护进程。

         建立守护进程的5个步骤:

1,fork()创建子进程后,父进程立即退出。这样子进程就变为孤儿进程。

2,调用setsid():是创建的进程脱离控制终端,同时创建新的 进程组,使得新创建的进程为该进程组的首进程。

3,再用fork(),产生 的子进程将继承父进程的当前工作目录。注:如果当前进程没结束,其工作目录就不能被卸载,为了避免这种情况,需将工作目录切换下,chdir(“/home/”)。

4,关闭文件描述符。新的子进程继承了父进程打开的文件描述符,子进程不用这些,需要将其关闭。

5,守护进程创建了一些临时文件,umask()将这些屏蔽。

用scribes建立daemon.c文件:

#include<stdlib.h>
#include<unistd.h>
#include<signal.h>
#include<sys/param.h>
#include<sys/types.h>
#include<sys/stat.h>

#include <stdio.h>
#include <time.h>

void init_daemon(void)     //守护进程初始化函数
{
  int pid;
  int i;
  if(pid=fork())   //步骤1
      exit(0);                   //是父进程,结束父进程
  else if(pid< 0)
      exit(1);                  //fork失败,退出


  setsid();  //步骤2


  if(pid=fork())    //步骤3 
     exit(0);                 //是第一子进程,结束第一子进程
  else if(pid< 0)
     exit(1);                 //fork失败,退出

chdir("/tmp");          //改变工作目录到/tmp

  for(i=0;i< NOFILE;++i)  //关闭打开的文件描述符 步骤4
     close(i); 


    umask(0);               //重设文件创建掩模 //步骤5
  return;
}
void init_daemon(void);
 int main(int argc,char* argv[])
{
  FILE *fp;
  time_t t;
  init_daemon();        //初始化为Daemon
  while(1)              //每隔一分钟向test.log报告运行状态
  {
     sleep(60);            //睡眠一分钟
     if((fp=fopen("test.log","a")) >=0)
     {
        t=time(0);
        fprintf(fp,"I'm here at %s\n",asctime(localtime(&t)));
        fclose(fp);
     }
  }
  return 0;
}

输出:

原创粉丝点击