首页 > 系统相关 >守护进程

守护进程

时间:2023-09-17 15:01:29浏览次数:24  
标签:daemon log EXIT 进程 include 守护

在计算机科学中,守护进程(daemon)是一种在后台运行的系统服务或进程,独立于用户会话的一种特殊进程。它们通常在系统启动时启动,并在系统关闭时终止。守护进程不依赖于任何特定的用户登录会话,并且通常以超级用户权限运行。

下面我们将介绍守护进程的详细用法以及一个具体案例。

详细用法

  1. 创建守护进程

    创建守护进程的一般步骤如下:

    a. 在父进程中创建子进程,并退出父进程,使子进程成为孤儿进程。

    b. 在子进程中调用 setsid() 创建一个新会话,脱离原始的终端会话。

    c. 修改当前工作目录,防止进程占用需要卸载的文件系统。

    d. 修改文件权限掩码,以确保守护进程有足够的权限访问所需的文件。

    e. 关闭标准输入、输出和错误输出,防止守护进程与终端进行任何交互。

  2. 具体实现

    #include <stdlib.h>
    #include <unistd.h>
    #include <stdio.h>
    
    void create_daemon() {
        pid_t pid = fork();
    
        if (pid < 0) {
            perror("Fork failed");
            exit(EXIT_FAILURE);
        }
    
        if (pid > 0) {
            // Exit the parent process
            exit(EXIT_SUCCESS);
        }
    
        // Create a new session and detach from the controlling terminal
        if (setsid() < 0) {
            perror("setsid failed");
            exit(EXIT_FAILURE);
        }
    
        // Change working directory to root
        if (chdir("/") < 0) {
            perror("chdir failed");
            exit(EXIT_FAILURE);
        }
    
        // Change file mode mask
        umask(0);
    
        // Close standard file descriptors
        close(STDIN_FILENO);
        close(STDOUT_FILENO);
        close(STDERR_FILENO);
    }
    
    int main() {
        create_daemon();
    
        // Run the daemon logic here
    
        return EXIT_SUCCESS;
    }
    

    这是一个简单的创建守护进程的函数 create_daemon() 和一个主函数 main() 的示例。

具体案例介绍

假设我们要编写一个守护进程,定期打印一些信息到日志文件。下面是一个基本的示例:

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void create_daemon() {
    pid_t pid = fork();

    if (pid < 0) {
        perror("Fork failed");
        exit(EXIT_FAILURE);
    }

    if (pid > 0) {
        exit(EXIT_SUCCESS);
    }

    if (setsid() < 0) {
        perror("setsid failed");
        exit(EXIT_FAILURE);
    }

    if (chdir("/") < 0) {
        perror("chdir failed");
        exit(EXIT_FAILURE);
    }

    umask(0);

    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);
}

void write_to_log() {
    int fd;
    fd = open("/var/log/my_daemon.log", O_WRONLY | O_CREAT | O_APPEND, 0644);

    if (fd < 0) {
        perror("open failed");
        exit(EXIT_FAILURE);
    }

    dprintf(fd, "Logging information...\n");
    close(fd);
}

int main() {
    create_daemon();

    while (1) {
        write_to_log();
        sleep(10);
    }

    return EXIT_SUCCESS;
}

在这个例子中,我们创建了一个守护进程,它每隔10秒将一条日志信息写入 /var/log/my_daemon.log 文件。守护进程在后台运行,并定期执行写入操作。

  • create_daemon() 函数用于创建守护进程,遵循之前提到的步骤。
  • write_to_log() 函数用于向日志文件写入信息。
  • main() 函数中,我们创建守护进程并进入一个无限循环,在循环中调用 write_to_log() 函数以实现日志记录。

你可以将这段代码编译并在后台运行,然后查看 /var/log/my_daemon.log 文件,以查看守护进程写入的日志信息。

标签:daemon,log,EXIT,进程,include,守护
From: https://www.cnblogs.com/keep--fighting/p/17708760.html

相关文章

  • linux-进程管理
    进程管理的作用1、判断服务器健康状态2、查看系统中所有进程3、杀死进程 ps命令psaux:查看系统中所有进程ps-le:查看系统中所有进程 选项-a:显示一个终端的所有进程,除了会话引线-u:显示进程的归属用户及内存的使用情况-x:显示没有控制终端的进程-l:长格式显示。显......
  • 网络协议的重要性与应用:理解进程间通信和网络分层结构(上)
    进程间通信有多种方式,包括管道、消息队列、共享内存和信号等。然而,如果不同设备上的进程需要进行通信,就只能通过网络来实现。由于设备的多样性,为了兼容各种设备,就需要一个统一通用的网络协议。学习网络协议的关键是了解其分层结构。之前在计算机基础专栏已经提到过网络分层的好处......
  • 进程管理4以及信号控制进程
    一:Linux系统中的job和process这个job就是系统中的任务,系统会管理每个Shell并分配一个jobnumber(任务号码),如果你子啊一个命令行上执行了多个命令,系统会将整个过程看作一项任务。一个进程可以作为一项任务,多个进程也可以作为一项任务。任务也分前台任务和后台任务,前台任务会与键盘......
  • 5.进程线程模型你知道多少?
    5.进程线程模型你知道多少?1.进程进程创建与结束背景知识:进程有两种创建方式,一种是操作系统创建的一种是父进程创建的。从计算机启动到终端执行程序的过程为:0号进程->1号内核进程->1号用户进程(init进程)->getty进程->shell进程->命令行执行进程。所以......
  • APC进程注入C++示例和检测思考
    直接贴C++代码效果:apc注入到pid为39712的进程procexp可以看到注入的DLL! 好了,我们看看代码如何写:注入部分//inject3.cpp:此文件包含"main"函数。程序执行将在此处开始并结束。#include<iostream>#include<Windows.h>#include<TlHelp32.h>usingnamespacestd;......
  • 人脸识别中对比学习的损失函数(演化进程)
    参考文献:https://zhuanlan.zhihu.com/p/40775212https://blog.csdn.net/yiran103/article/details/836846131.softmax在初期,人脸识别模型通常使用softmax损失函数,其实就是在超平面上进行分类划分。这样的分类其实是乱七八糟的。注意,由此式不难得到:可以改写成下式这样,带有......
  • Linux如何查看指定进程是否阻塞
    使用ps命令查找进程的进程ID(PID):psaux|grep<进程名或关键字>这将显示与指定进程名或关键字匹配的进程列表。注意,可以根据需要使用其他参数来过滤和查找特定的进程。找到你要检查的进程的PID,并记下它。使用top命令查看进程的状态:top-p<PID>这将显示指定PID的......
  • 进程
    1.进程的概念程序:二进制文件,占用的磁盘空间进程:启动的程序所有的数据都在内存中需要占用更多的系统资源cpu,物理内存 2.并行和并发并发:在操作系统中,是指一个时间段中有几个程序都处于已启动运行到运行完毕之间,且这几个程序都是在同一个处理机上运行 并发不是真正意......
  • 操作系统2——进程
    进程的定义 QQ程序指令就是程序段,数据段就是程序运行过程中的产生的数据   线程   自己编写的许多线程库     刮起进程在外存中,阻塞还在内存中调度算法   进程同步互斥   策略 违背了空闲则进的原则,一个不让用......
  • 如何在gradio使用多进程,并且使用进度条显示多进程
    直接上代码:defmethod_a(progress=gr.Progress(track_tqdm=True)):pool=multiprocessing.Pool(multiprocessing.cpu_count())param_v=range(10)pbar=tqdm(total=len(param_v))resy=[]forpinparam_v:pool.apply_async(task_deal......