Linux系统编程(守护进程)

news2024/11/23 8:07:09

文章目录

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


前言

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

一、守护进程概念

守护进程(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://www.coloradmin.cn/o/754792.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

golang IDE 使用 go-1.7 无法识别 goroot问题

问题 当前使用了 golang IDE 要设定 go-1.17 版本作为默认 GOROOT 系统环境变量已经定义好 打开了 ide 会出现下面问题&#xff0c;选择 1.17 后会出现下面报错 error message The selected directory is not a valid horne for GO SDK 解决方法 修改 $GOROOT 下文件增加一个变…

动态表单实现原理

目录 动态表单是什么 动态表单的关键 前后端职责 数据库与表结构 功能实现与改进建议 动态表单是什么 静态表单是很常见&#xff0c;也是常规做法&#xff0c;其表单的结构是固定的&#xff0c;通常情况下一个表单对应数据库的一张表&#xff0c;表单中一个数据项对应数据表的一…

物业小程序制作:提升管理效率与服务质量

随着物业管理的日益复杂&#xff0c;物业小程序成为了提高管理效率和提供优质服务的重要工具。物业小程序旨在提供高效的物业管理服务。通过物业小程序&#xff0c;物业公司能够方便地与业主进行信息交流、报修处理等操作。 物业小程序的好处 提高管理效率&#xff1a;物业小程…

暑假第七天打卡

离散&#xff1a; 主析取范式和主合取范式的应用&#xff1a; &#xff08;1&#xff09;求公式成真与成假赋值&#xff1a; 化为主析取范式后&#xff0c;下标化为二进制就是成真赋值&#xff0c;不在下标里的就是成假赋值 化为主合取范式后&#xff0c;下标化为二进制就是…

2.Postgresql--array

CREATE TABLE city(country character varying(64),city character varying(64) );INSERT INTO city VALUES (中国,台北), (中国,香港), (中国,上海), (日本,东京), (日本,大阪);select country,string_agg(city,; order by city desc) from city group by countryselect coun…

React native 已有项目升级兼容web

基础 概念 | webpack 中文文档 | webpack 中文文档 | webpack 中文网 深入理解Webpack及Babel的使用 - 掘金 Introduction to React Native for Web // React Native for Web Webpack 是一个现代的 JavaScript 应用程序的静态模块打包工具&#xff0c;它将应用程序所依赖的各…

DynaSLAM2 2020论文翻译

DynaSLAM2:紧耦合的多目标追踪和SLAM 摘要 - 场景刚度的假设在视觉SLAM算法中很常见。但是&#xff0c;它限制了它们在人口稠密的现实环境中的适用性。此外&#xff0c;大多数智力包括自动驾驶&#xff0c;多机器人协作和增强/虚拟现实&#xff0c;都需要对周围环境进行明确的…

Low-Light Image Enhancement via Self-Reinforced Retinex Projection Model 论文阅读笔记

这是马龙博士2022年在TMM期刊发表的基于改进的retinex方法去做暗图增强&#xff08;非深度学习&#xff09;的一篇论文 文章用一张图展示了其动机&#xff0c;第一行是估计的亮度层&#xff0c;第二列是通常的retinex方法会对估计的亮度层进行RTV约束优化&#xff0c;从而产生…

Java正则校验:密码必须由字母和数字组成,且大于等于8个字符。

需求 对登录密码进行校验&#xff0c;需要密码必须由字母和数字组成&#xff08;同时包括数字和数字&#xff09;&#xff0c;且大于等于8个字符。 原理 使用正则表达式校验字符串。 正则表达式构建思路&#xff1a; 字符为数字或字母&#xff1b;不能全是数字&#xff1b…

关于cip.cc查IP出口地址的工具到底准确不准确?

关于 cip.cc 或其他在线IP查询工具的准确性&#xff0c; 首先来看2张图片&#xff0c;分别如下 实际情况就是作者在杭州&#xff0c;使用的网络出口地址应该是百度的&#xff0c;而不是cip.cc所显示的地址。 所以结论是cip.cc并不靠谱&#xff0c;我又查阅了相关资料如下 1.…

Centos7部署nacos集群

一、GitHub下载Nacoc安装包 https://github.com/alibaba/nacos/releases 二、环境准备 1.服务器准备 2、JVAV环境安装 每台服务器都安装 JDK&#xff1a;yum install java-1.8.0-openjdk* -y三、软件安装 1、上传下载好的压缩包导服务目录&#xff08;自定义/app&#xff…

Spring Scope

Spring中五种 Scope域 singleton&#xff0c;容器启动时创建&#xff08;未设置延迟&#xff09;&#xff0c;容器关闭时销毁【单例】prototype&#xff0c;每次使用时创建&#xff0c;不会自动销毁&#xff0c;需要调用 DefaultListableBeanFactory.destroyBean(bean) 销毁【…

前端Web实战:从零打造一个类Visio的流程图拓扑图绘图工具

前言 大家好&#xff0c;本系列从Web前端实战的角度&#xff0c;给大家分享介绍如何从零打造一个自己专属的绘图工具&#xff0c;实现流程图、拓扑图、脑图等类Visio的绘图工具。 你将收获 免费好用、专属自己的绘图工具前端项目实战学习如何从0搭建一个前端项目等基础框架项…

小白到运维工程师自学之路 第五十三集 (rsync+inotify备份)

一、概述 Rsync是一个用于在不同计算机之间同步文件和文件夹的工具。它可以在本地计算机和远程服务器之间复制、更新和备份文件。rsync通过比较源和目标文件的差异来最小化传输的数据量&#xff0c;从而提供高效的文件同步功能。 Inotify是Linux内核提供的一种机制&#xff0…

【C++】模板(函数模板与类模板)讲解

本篇文章会对C中的模板进行讲解&#xff0c;其中会对函数模板和类模板进行讲解。希望本篇文章会对你有所帮助。 文章目录 一、函数模板 1、1 模板的引入 1、2 函数模板举例讲解 1、2、1 函数模板的概念 1、2、2 函数模板格式 1、2、3 函数模板实例化 1、2、4 模板参数的匹配原则…

2023下半年软考高级系统架构设计师怎么报名?

软考高级系统架构设计师报名时间&#xff1a; 广西2023下半年软考高级系统架构设计师报名时间&#xff1a;8月15日8:00至8月24日17:00 广东2023下半年软考高级系统架构设计师报名时间&#xff1a;8月16日9:00-8月24日17:00 甘肃2023下半年软考高级系统架构设计师报名时间&am…

恢复idea删除的git本地文件

idea中删除git本地文件无法远程拉取pull已删除文件的问题 当前本地库处于另一个分支中&#xff0c;需将本分支Head重置&#xff0c;git 强行pull并覆盖本地文件 解决方式一&#xff1a; git fetch --all git reset --hard origin/master git pull解决方式二&#xff1a; git…

Docker基础——基础详解

仓库&#xff0c;镜像&#xff0c;容器的关系 Docker镜像 当运行容器时&#xff0c;使用的镜像如果在本地中不存在&#xff0c;docker 就会自动从 docker 镜像仓库中下载&#xff0c;默认是从 Docker Hub 公共镜像源下载 镜像列表 可以使用 docker images 来列出本地主机上的…

vue3,elementPlus和自己封装,点击 新增添加表单,删除表单,提交数据

ElementPlus下的form也有新增表单 如果你写H5等没找到合适的 自己也可以进行封装 实现3个代码讲解:1&#xff1a;ElementPlus的代码 2&#xff1a;自己书写的代码 3&#xff1a;自己把2的代码进行封装 1&#xff1a;ElementPlus的运行效果 点击提交 1&#xff1a;ElementPlus…

jieba和WordCloud

词云图像 import wordcloud import jieba import matplotlib.pyplot as plttext"中华人民共和国是伟大的国家,我最敬爱的祖国啊&#xff0c;你是美丽的花园" textjieba.lcut_for_search(text) text" ".join(text) wwordcloud.WordCloud(width1000,height8…