跳转至内容
  • 社区首页
  • 版块
  • 最新
  • 标签
  • 热门
折叠

GitHub中文论坛

  1. 主页
  2. 版块
  3. Github & Git
  4. 创建守护进程

创建守护进程

已定时 已固定 已锁定 已移动 Github & Git
1 帖子 1 发布者 179 浏览
  • 从旧到新
  • 从新到旧
  • 最多赞同
回复
  • 在新帖中回复
登录后回复
此主题已被删除。只有拥有主题管理权限的用户可以查看。
  • OAHINTTO 离线
    OAHINTTO 离线
    OAHINTT
    写于 最后由 编辑
    #1

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

    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 条回复 最后回复
    0
    回复
    • 在新帖中回复
    登录后回复
    • 从旧到新
    • 从新到旧
    • 最多赞同


    • 登录

    • 第一个帖子
      最后一个帖子
    0
    • 社区首页
    • 版块
    • 最新
    • 标签
    • 热门