守护进程

在计算机科学中,守护进程(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 文件,以查看守护进程写入的日志信息。

作者:keep--fighting

出处:https://www.cnblogs.com/keep--fighting/p/17708760.html

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。

posted @   ⭐⭐-fighting⭐⭐  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· winform 绘制太阳,地球,月球 运作规律
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· AI 智能体引爆开源社区「GitHub 热点速览」
· 写一个简单的SQL生成工具
· Manus的开源复刻OpenManus初探
more_horiz
keyboard_arrow_up light_mode palette
选择主题
menu
点击右上角即可分享
微信分享提示