一文搞懂守护进程

一.守护进程

1.1概念

守护进程(Daemon)是在计算机操作系统中以后台形式运行的一类特殊进程。它们在系统启动时被启动,一直运行在后台,不依赖于任何用户交互,也不与任何终端相关联。

守护进程的主要目标是提供一种持续运行的服务,通常用于执行一些系统级任务或提供特定的功能和服务。例如,守护进程可以用于管理网络服务、定时任务、系统监控、日志记录等。它们通常作为系统的一部分,在操作系统启动时通过启动脚本或系统配置文件自动启动,并且在系统关闭前会被自动终止。

守护进程通常以父进程(通常是init进程)的方式运行,并且它们会脱离终端的控制。这意味着它们不会受到用户登录会话的影响,不会受用户注销或终端断开的影响,而且不会向终端输出任何信息。

此外,守护进程通常会将自己的运行日志写入日志文件,以便后续的故障排查和日志分析。它们在运行期间往往以系统权限运行,以便执行系统级任务,因此需要注意确保安全性。

总结来说,守护进程是在后台以系统服务的形式持续运行的特殊进程。它们在系统启动时自动启动,不依赖于用户交互和终端,主要用于执行系统级任务和提供特定的功能和服务。

1.2作用

守护进程(Daemon)在计算机系统中扮演着重要的角色,具有以下几个主要作用:

  1. 提供持续性服务:守护进程通常用于提供持续性的服务,这些服务在系统运行期间一直保持运行状态。通过守护进程,可以实现后台任务的自动化执行,例如服务的启动和停止,定时任务的执行,系统监控和维护等。

  2. 后台处理任务:守护进程通常用于执行一些需要在后台处理的任务。它们不依赖于用户交互和终端,可以在系统运行期间持久地进行工作。这主要包括一些系统级任务,如网络服务、文件处理、日志记录、备份、数据同步等。

  3. 提供服务和功能:守护进程用于提供特定的服务和功能。这些服务可以是网络相关的,如Web服务器、FTP服务器、邮件服务器等;也可以是系统级的,如定时任务调度器、系统监控服务、日志收集器等。通过守护进程,可以将这些功能以持续、自动化的方式提供给用户。

  4. 系统维护和管理:守护进程还用于系统的维护和管理。它们可以监视系统的运行状态,及时处理和报告问题。例如,守护进程可以监控硬件故障、内存和硬盘使用情况,提供警报和日志记录。同时,守护进程也可以协助系统管理员进行系统配置和管理,实现对系统资源的优化和控制。

总的来说,守护进程在计算机系统中承担着重要的角色,用于提供持续性服务、后台处理任务、提供特定的服务和功能,以及系统维护和管理。它们使得系统能够实现自动化、高效、稳定地执行各种任务,提供良好的用户体验和系统性能。

1.3特点

守护进程(Daemon)具有以下几个特点:

  1. 后台运行:守护进程以后台形式运行,不依赖于任何用户交互或终端。它们在系统启动时被自动启动,并在系统运行期间持续执行。这使得它们可以在系统运行期间提供服务和执行任务,而无需用户干预或终端的打开。

  2. 脱离终端:守护进程与任何终端无关,不会与终端进行交互。它们不会向终端输出任何信息,也不会接收来自终端的输入。这意味着守护进程在后台默默地执行任务,不会干扰用户的终端会话。

  3. 生命周期长:守护进程在系统启动时被创建,并持续运行直至系统关闭或手动终止。它们通常以父进程的方式运行,由系统的init进程或其他启动脚本完成启动。守护进程的长生命周期使得它们能够提供持续性的服务,处理长时间运行的任务。

  4. 不受用户会话影响:守护进程与用户会话无关,不受用户登录、注销或会话断开的影响。它们以系统级的身份运行,拥有独立的运行环境和权限。这使得守护进程能够在系统运行期间持续提供服务和执行任务,独立于特定用户或会话的状态。

  5. 日志记录:守护进程通常会将自己的运行日志写入特定的日志文件中。这些日志记录包含守护进程运行的详细信息,用于故障排查、性能分析和系统监控。日志记录可以帮助系统管理员了解守护进程的运行状况,发现问题并进行相应的处理。

总的来说,守护进程以后台形式运行,脱离终端,具有长生命周期,不受用户会话影响,同时也会进行日志记录。这些特点使得守护进程能够在系统运行期间提供持续性的服务,执行后台任务,并具备独立的运行环境和权限。

1.4编程步骤

  1. 创建子进程并终止父进程:使用 fork() 系统调用创建一个子进程,并在父进程中使用 exit() 函数终止,确保子进程可以继续执行。

  2. 在子进程中创建新会话和新进程组:使用 setsid() 系统调用创建一个新的会话,并使当前进程成为新会话的领导进程。这样可以脱离终端会话,避免受到终端信号的影响。

  3. 设置文件掩码:使用 umask() 系统调用设置文件掩码,通过屏蔽某些权限位来限制新建文件的默认权限。比如调用 umask(0) 将文件掩码设置为0,即不屏蔽任何权限位。

  4. 更改工作目录:使用 chdir() 系统调用将当前工作目录切换到一个合适的目录,一般选择一个不会被卸载的目录,例如根目录 /

  5. 关闭文件描述符:由于守护进程不再需要与终端交互,需要关闭标准输入、标准输出和标准错误输出的文件描述符。可以使用 close() 系统调用关闭这些文件描述符。

  6. 执行任务并处理信号:在守护进程中执行自己的任务逻辑,如网络服务或定时任务。同时需要注册信号处理函数,处理来自操作系统的信号,如重新加载配置或优雅地终止。

请注意,编写守护进程时除了上述步骤外,还应注意错误处理、日志记录和安全性等方面的问题。最好参考特定编程语言和操作系统的文档和示例代码以获取更详细的实现细节。

1.5编程实例

#include 
#include 
#include 
#include 
#include 
#include 

int main(int argc, char const *argv[])
{
    //1.创建子进程,父进程退出,子进程成为后台进程
    pid_t pid;
    pid = fork();
    if (pid < 0)
    {
        perror("fork is err");
        exit(-1);
    }
    else if (pid > 0)
    {
        exit(0);
    }

    //2.创建新会话,成为会话组组长,摆脱终端影响
    setsid();

    //3.改变当前工作目录
    chdir("/");

    //4.重新设置文件掩码
    umask(0);

    //5.关闭不需要的文件按描述符号
    for (int i = 0; i < 2; ++i)
        close(i);

    int fd = open("/home/hq/demo/进程/守护进程/temp", O_WRONLY | O_CREAT | O_TRUNC);
    if (fd < 0)
    {
        perror("open is err");
        exit(-1);
    }

    while (1)
    {
        write(fd,"hello\n",6);
        sleep(1);
    }
    return 0;
}

你可能感兴趣的:(开发语言,linux)