zoukankan      html  css  js  c++  java
  • [linux] C语言Linux系统编程-做成守护进程

    守护进程:

    必须是init进程的子进程,运行在后台,不与任何控制终端相关联。

    通过以下步骤成为守护进程

    1.调用fork()创建出来一个新的进程,这个新进程会是将来的守护进程

    2.在新守护进程的父进程中,调用exit(),为了守护进程的爷爷进程确认父进程结束

    3.在新守护进程中,调用setsid(),使得该进程有一个新的进程组和新的会话,保证了该进程不与控制终端相关联

    4.chdir()将当前工作目录改为根目录,因为前面fork出来的新进程,当前工作目录可能在文件系统的任何地方

    5.关闭所有文件描述符

    6.打开 0 1 2号文件描述符(标准输入,标准输出,标准错误),把它们重定向到/dev/null

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <linux/fs.h>
    int main(){
            int ret;
            //创建新进程
            ret=fork();
            //创建失败的直接返回
            if(ret<0){
                    return -1;
            }
            //父进程直接结束
            if(ret>0){
                    exit(EXIT_SUCCESS);
            }
            //创建新的进程组和会话
            ret=setsid();
            //失败的直接返回
            if(ret<0){
                    return -1;
            }
            //改变当前工作目录
            chdir("/");
            //关闭所有文件描述符
            //标准输入输出重定向到/dev/null
            //NR_FILE 是系统在某一给定时刻,限制的文件总数
            for(int i=0;i<NR_FILE;i++){
                    close(i);
            }
            open("/dev/null",O_RDWR);
            dup(0);
            dup(0);
    
            //下面可以写自己的操作...
            while(1){
                    sleep(1);
            }
            return 0;
    }

    自带函数:daemon();

    原型 int daemon(int nochdir,int noclose)

    nochdir0 改为根目录,noclose0 关闭所有文件描述符

    daemon(0,0)

    #include <sys/types.h>
    #include <sys/stat.h>
    #include <stdlib.h>
    #include <stdio.h>
    #include <fcntl.h>
    #include <unistd.h>
    #include <linux/fs.h>
    int main(){
            daemon(0,0);
            //下面可以写自己的操作...
            while(1){
                    sleep(1);
            }   
            return 0;
    }

     

  • 相关阅读:
    JavaScript跳转到指定页面并且到指定的tab切换窗口
    三层架构之基础篇(对数据库增删改查)
    三层架构之基础篇(三层架构模型)
    过一天不登QQ的生活
    MVC + EF 框架 对数据库做增删改查
    想说的话
    新的2019年,向上
    C#读取txt文档
    C#写的 电子邮件客户端(winform窗体)
    C# 鼠标任意拖动无边框窗体(调用API函数)。
  • 原文地址:https://www.cnblogs.com/taoshihan/p/8011932.html
Copyright © 2011-2022 走看看