linux

C++如何编写Linux下的守护进程

小樊
43
2025-07-18 04:52:13
栏目: 编程语言

在Linux下编写C++守护进程(Daemon)通常涉及以下几个步骤:

  1. 创建子进程并退出父进程:确保守护进程在后台运行,与终端会话无关。
  2. 创建新的会话:使用setsid()函数创建一个新的会话,使守护进程成为会话首进程,脱离控制终端。
  3. 设置文件权限掩码:使用umask(0)来设置文件权限掩码,防止守护进程继承不必要的权限。
  4. 切换工作目录:将工作目录切换到根目录(/),避免占用可卸载的文件系统。
  5. 关闭标准文件描述符:关闭标准输入、输出和错误流,防止守护进程持有这些资源。
  6. 处理信号:设置适当的信号处理机制,以便优雅地终止守护进程。

下面是一个简单的C++示例,演示如何创建一个守护进程:

#include <iostream>
#include <unistd.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <signal.h>
#include <fcntl.h>

// 信号处理函数
void handle_signal(int signum) {
    if (signum == SIGTERM) {
        std::cout << "Received SIGTERM, exiting..." << std::endl;
        exit(signum);
    }
}

int main() {
    // 1. 创建子进程并退出父进程
    pid_t pid = fork();
    if (pid < 0) {
        std::cerr << "Fork failed!" << std::endl;
        return 1;
    }
    if (pid > 0) {
        // 父进程退出
        exit(0);
    }

    // 2. 创建新的会话
    if (setsid() < 0) {
        std::cerr << "Failed to create new session!" << std::endl;
        return 1;
    }

    // 3. 设置文件权限掩码
    umask(0);

    // 4. 切换工作目录
    if (chdir("/") < 0) {
        std::cerr << "Failed to change directory to /!" << std::endl;
        return 1;
    }

    // 5. 关闭标准文件描述符
    close(STDIN_FILENO);
    close(STDOUT_FILENO);
    close(STDERR_FILENO);

    // 6. 处理信号
    struct sigaction sa;
    sa.sa_handler = handle_signal;
    sigemptyset(&sa.sa_mask);
    sa.sa_flags = 0;

    if (sigaction(SIGTERM, &sa, NULL) == -1) {
        std::cerr << "Failed to set signal handler!" << std::endl;
        return 1;
    }

    // 守护进程主逻辑
    while (true) {
        // 执行守护进程任务
        std::cout << "Daemon is running..." << std::endl;
        sleep(10);
    }

    return 0;
}

编译和运行

  1. 将上述代码保存为daemon.cpp
  2. 使用以下命令编译:
    g++ -o daemon daemon.cpp
    
  3. 运行守护进程:
    ./daemon
    

注意事项

通过以上步骤,你可以创建一个基本的Linux守护进程。根据具体需求,你可能需要进一步扩展和优化代码。

0
看了该问题的人还看了