Navigation

    GitHub中文社区
    • GitHub排行榜

    论坛

    • Login
    • Categories
    • Recent
    • Tags
    • Popular

    创建守护进程

    Github & Git
    1
    1
    115
    Loading More Posts
    • Oldest to Newest
    • Newest to Oldest
    • Most Votes
    Reply
    • Reply as topic
    Log in to reply
    This topic has been deleted. Only users with topic management privileges can see it.
    • OAHINTT
      OAHINTT last edited by

      守护进程:系统一开启就默默在后台执行,结束关闭。

      1.创建子进程,父进程退出。//fork()&exit()
      2.在子进程中创建新会话。//setsid()
      3.将当前目录改为根目录or\tmp。 //chdir("\tmp")
      4.重设权限掩码。//umask(0)
      5.关闭文件描述符。//getdtablesize():系统能最大打开文件描述符个数

      #include <stdio.h>
      #include <sys/types.h>
      #include <sys/stat.h>
      #include <unistd.h>
      #include <stdlib.h>
      
      void mydaemon();
      int main(int argc, char *argv[])
      { 
          mydeamon();
          //守护进程实现功能:在后台每隔1s往1.txt里写入hello,要换行
          FILE *fp = fopen("1.txt","a+");
          if(NULL == fp)
          {
              perror("fopen");
              return -1;
          }
          while(1)
          {
              sleep(1);
              fprintf(fp,"%s\n","hello");
              fflush(fp);//标准IO的buffer缓冲机制
          }
          return 0;
      }
      
      //创建守护进程
      void mydaemon()
      {
          pid_t pid = fork();//创建子进程
          if(pid < 0)
          {
              perror("fork");
              exit(-1);
          }else if(pid == 0)
          {
              if(-1 == setsid())//创建新会话
              {
                  perror("setsid");
                  exit(-1);
              }
              if(-1 == chdir("/tmp"))//改变当前目录为/tmp
              {
                  perror("chdir");
                  exit(-1);
              }
              umask(0);//重设权限掩码
              for(int i = 0;i < getdtablesize();i++)//关闭所有文件描述符
              {
                  close(i);
              }
          }else{
              exit(0);//父进程退出
          }
      }
      1 Reply Last reply Reply Quote 0
      • First post
        Last post