Linux系统编程(守护进程)

news/2024/7/5 1:54:18

文章目录

  • 前言
  • 一、守护进程概念
  • 二、空洞文件
  • 三、创建守护进程
  • 总结


前言

本篇文章我们来讲解守护进程,守护进程在进程中是一个比较重要的概念,在笔试面试中也经常考到,这篇文章就带大家来学习一下什么是守护进程。

一、守护进程概念

守护进程(Daemon Process)是在后台运行的一种特殊类型的进程,独立于终端会话,并且通常没有与用户交互的界面。守护进程在操作系统启动时启动,并持续运行,提供某种服务或执行特定的任务。
以下是守护进程的一些特点和作用:

1.后台运行:守护进程在后台运行,与终端会话无关。它不会像前台进程一样与终端交互,也不会受到终端关闭的影响。

2.无用户交互:守护进程通常没有与用户直接交互的界面。它在后台默默地运行,执行特定的任务或提供服务,如网络服务、定时任务等。

3.生命周期控制:守护进程通常由操作系统启动,在操作系统运行期间一直保持活动状态。它可以在操作系统启动时自动启动,并在系统关闭时自动终止。

4.分离与父进程:守护进程通常会从父进程(比如 Shell)中分离,成为一个独立的进程组,没有与终端相关联。这样可以避免与终端的交互和输出。

5.日志和错误处理:守护进程通常会将输出记录到日志文件中,而不是直接向终端输出。这有助于跟踪和排除问题,并提供可靠的错误处理机制。

6.无控制终端:守护进程不会占用、控制或依赖于终端设备,这使得它们可以在系统无人值守时运行。它们可以在系统启动后一直执行,无需用户干预。

守护进程的设计和实现要考虑到一些关键问题,如资源管理、信号处理、错误处理、日志记录、进程间通信等。同时,为了实现守护进程的特性,Linux 中提供了一些守护进程相关的编程技术和系统调用,如 fork()、setsid()、umask()、open()、chdir()、close() 等。

创建和管理守护进程需要谨慎处理,确保守护进程正确启动、运行和终止,同时记录必要的日志信息,以便进行故障排除。通常,各个 Linux 发行版提供了一些工具和约定用于配置和管理守护进程,如 Systemd、Upstart 和 SysVinit 等。

总而言之,守护进程是在后台运行的一种特殊类型的进程,独立于终端会话,并且没有与用户交互的界面。它们提供特定的服务或执行特定的任务,通常在操作系统启动时运行,并持续提供服务。

二、空洞文件

/dev/null 是一个特殊的设备文件,也被称为空洞文件或黑洞文件。

以下是对 /dev/null 空洞文件的一些特点和用途:

数据丢弃:将数据写入 /dev/null 相当于将其永久丢弃,数据不会进行存储,也不会影响其他进程和文件系统。这在某些情况下非常有用,比如不需要关心命令的输出结果或需要忽略某些输出。

输出重定向:可以将命令的输出重定向到 /dev/null,这样输出将会被丢弃,不显示在终端或输出到其他地方。通过将标准输出或标准错误重定向到 /dev/null,可以静默执行命令或过滤掉不需要的输出。

例如,command > /dev/null 将命令的标准输出重定向到 /dev/null,从而使输出被丢弃。

同样,command 2> /dev/null 将命令的标准错误输出重定向到 /dev/null,以丢弃标准错误输出。

虚拟输入:通过从 /dev/null 读取数据,会立即得到一个文件结束符(EOF),即读操作立即返回,不会返回任何实际数据。在一些情况下,当需要一个空的输入源时,可以从 /dev/null 读取数据。

总结来说,/dev/null 空洞文件在 Unix-like 系统中用于丢弃数据、将输出静默化或提供一个空的输入源。它是一种有用的机制,可用于在处理数据和命令输出时,忽略不需要的信息。

请注意,/dev/null 是一个特殊文件,而不是目录。在文件系统中,它位于 /dev 目录下,并且常常被用于 I/O 操作的重定向。

三、创建守护进程

这段代码的守护进程创建过程如下:

父进程创建子进程。

父进程退出,子进程成为孤儿进程,由 init 进程接管。

子进程创建孙子进程。

子进程退出,孙子进程成为孤儿进程,由 init 进程接管。

孙子进程成为新会话的首进程,并失去对控制终端的控制。

孙子进程修改文件权限掩码、切换工作目录、关闭标准输入输出文件描述符、重新打开指定的文件描述符(包括将输出重定向到日志文件)。

孙子进程进入一个无限循环,在每次循环中执行一些操作。

这样创建的守护进程在后台运行,与终端无关,不接收终端输入,并且将输出写入日志文件或丢弃。

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

int main(void)
{
    pid_t pid = 0;
    int i = 0;
    pid = fork();

    if(pid > 0)
    {
        printf("pid : %d\n", getpid());
        exit(0);
    }
    else if(pid == 0)
    {
        setsid();
        
        printf("pid : %d\n", getpid());
        if((pid = fork()) > 0)
        {
            printf("child = %d, ppid = %d, pgid = %d, sid = %d\n", getpid(), getppid(), getpgrp(), getsid(getpid()));
            printf("groundson: %d\n", pid);            
            exit(0);
        }
        else
        {
            umask(0);
            chdir("/");
            close(STDIN_FILENO);
            close(STDOUT_FILENO);
            close(STDERR_FILENO);

            i += open("/dev/null", O_RDONLY);  // 0 --> STDIN
            i += open("/home/book/linuxsystem/my.log", O_WRONLY);  // 1 --> STDOUT
            i += open("/dev/null", O_RDWR);    // 2 --> STDERR
            
            printf("child = %d, ppid = %d, pgid = %d, sid = %d\n", getpid(), getppid(), getpgrp(), getsid(getpid()));
                       
            while( 1 )
            {
                // do something
                printf("i = %d\n", i++);
                sleep(1);
                fflush(stdout);
            }
        }
    }


    return 0;
}

运行效果:
在这里插入图片描述
这里可以看出这个守护进程不属于任何一个终端,他会一直在后台运行下去,直到系统退出或者使用kill杀死进程。

总结

本篇文章就讲解到这里。


http://lihuaxi.xjx100.cn/news/1344011.html

相关文章

吴恩达机器学习2022-Jupyter

1 可选实验室: Python、 NumPy 和矢量化 简要介绍本课程中使用的一些科学计算。特别是 NumPy 科学计算包及其与 python 的使用。 2 目标 在这个实验室里将回顾课程中使用的 NumPy 和 Python 的特性。 Python 是本课程中使用的编程语言。NumPy 库扩展了 python 的基本功能&a…

基于PyQt5的图形化界面开发——打砖块

目录 0. 前言1. 砖块类定义2. 挡板类定义3. 碰撞检测4. 小球和游戏初始化5. 完整代码6. 运行效果演示7. Pyinstaller 编译exe程序PyQt5 0. 前言 本文使用 PyQt5实现一个打砖块小游戏 操作系统&#xff1a;Windows10 专业版 开发环境&#xff1a;Pycahrm Comunity 2022.3 Pyt…

拖动排序功能的实现 - 使用HTML、CSS和JavaScript

引言 在现代Web应用程序中&#xff0c;拖动排序是一种常见的用户界面交互方式&#xff0c;它允许用户通过拖动元素来重新排列列表或项目的顺序。本文将介绍如何使用HTML、CSS和JavaScript来实现手动拖动排序功能。 一、HTML结构 首先&#xff0c;我们需要定义一个列表&#…

“AI in the Alps“:身体与精神的一场盛宴

作者&#xff1a;Christofer Dutz 得益于 Timecho 的组织和安排&#xff0c;我最近参加了一个精彩绝伦的活动 “AI in the Alps”&#xff0c;并从中收获颇丰。 这次活动是由德国工业界知名博客 “Industrial AI Podcast”&#xff08;http://aipod.de&#xff09;的组织者 Ro…

Vue3+Vite+Pinia+Naive后台管理系统搭建之八:构建 login.vue 登录页

前言 如果对 vue3 的语法不熟悉的&#xff0c;可以移步Vue3.0 基础入门&#xff0c;快速入门。 项目所需要的图片&#xff0c;icon图标&#xff08;推荐&#xff1a;阿里巴巴矢量图标库&#xff09;自行获取&#xff0c;命名一致就行。 1. 构建 src/components/CopyRight.vu…

【每日一题】2673. 使二叉树所有路径值相等的最小代价

【每日一题】2673. 使二叉树所有路径值相等的最小代价 2673. 使二叉树所有路径值相等的最小代价题目描述解题思路 2673. 使二叉树所有路径值相等的最小代价 题目描述 给你一个整数 n 表示一棵 满二叉树 里面节点的数目&#xff0c;节点编号从 1 到 n 。根节点编号为 1 &#…

云计算的学习(六)

六、云计算的发展趋势 1.云计算相关领域介绍 1.1物联网 物联网来源于互联网&#xff0c;是万物互联的结果&#xff0c;是人和物、物和物之间产生通信和交互。 物联网主要技术&#xff1a; RFID技术&#xff08;射频识别技术&#xff09;传感器技术嵌入式系统技术 1.2大数据…

scrapy集成selenium

前言 使用scrapy默认下载器---》类似于requests模块发送请求&#xff0c;不能执行js&#xff0c;有的页面拿回来数据不完整 想在scrapy中集成selenium&#xff0c;获取数据更完整&#xff0c;获取完后&#xff0c;自己组装成 Response对象&#xff0c;就会进爬虫解析&#xff0…