【Linux】【守护进程】总结整理

守护进程(Daemon)是运行在后台的进程,通常没有与之关联的控制终端。守护进程在启动后会脱离控制终端,并继续在后台运行,即使用户退出登录或者终端关闭也不会影响它们的运行。守护进程常用于提供网络服务、定期执行任务或监控系统状态等。

b36c18698108474cbdf914b837796543.jpeg

守护进程的特点

  • 无控制终端:守护进程没有控制终端,这意味着它们通常不能接收来自终端的输入或输出。
  • 运行在后台:守护进程在后台运行,即使用户退出登录或关闭终端,守护进程仍然持续运行。
  • 长期运行:守护进程通常设计为长期运行,直到手动停止或系统重启。
  • 自动重启:有些守护进程会在意外终止后自动重启,以确保服务的连续性。

创建守护进程的步骤

创建守护进程通常涉及以下步骤:

  1. 创建子进程:使用fork()创建一个子进程。
  2. 成为会话领导者:在子进程中调用setsid()函数,使子进程成为一个新的会话的领导者,并与控制终端脱离。
  3. 改变当前工作目录:通常将当前工作目录更改为根目录/,以避免由于当前目录被卸载而导致的问题。
  4. 重设文件权限掩码:通常使用umask(0)设置文件权限掩码,这样守护进程创建的文件具有最宽松的权限。
  5. 关闭标准文件描述符:关闭标准输入、输出和错误文件描述符(通常是0、1和2),以防止这些描述符引用到已关闭的终端设备。
  6. 可能的第二次fork:为了确保守护进程不会保留任何进程组ID,有时会再次调用fork(),并在父进程中exit(),这样可以确保子进程不会成为一个作业控制进程。

示例代码

以下是一个简单的守护进程创建示例,使用 C 语言编写:

1#include <stdio.h>
2#include <stdlib.h>
3#include <unistd.h>
4#include <sys/types.h>
5#include <fcntl.h>
6#include <signal.h>
7#include <sys/stat.h>
8#include <errno.h>
9
10void become_daemon() {
11    pid_t pid;
12    int i;
13
14    // 第一次fork
15    pid = fork();
16    if (pid < 0) {
17        fprintf(stderr, "fork #1 failed: %d (%s)\n", errno, strerror(errno));
18        exit(EXIT_FAILURE);
19    }
20    if (pid > 0) {
21        // 父进程退出
22        exit(EXIT_SUCCESS);
23    }
24
25    // 成为会话领导者
26    if (setsid() < 0) {
27        fprintf(stderr, "setsid failed: %d (%s)\n", errno, strerror(errno));
28        exit(EXIT_FAILURE);
29    }
30
31    // 第二次fork
32    pid = fork();
33    if (pid < 0) {
34        fprintf(stderr, "fork #2 failed: %d (%s)\n", errno, strerror(errno));
35        exit(EXIT_FAILURE);
36    }
37    if (pid > 0) {
38        // 父进程退出
39        exit(EXIT_SUCCESS);
40    }
41
42    // 改变当前工作目录
43    if ((chdir("/")) < 0) {
44        fprintf(stderr, "chdir failed: %d (%s)\n", errno, strerror(errno));
45        exit(EXIT_FAILURE);
46    }
47
48    // 重设文件权限掩码
49    umask(0);
50
51    // 关闭标准文件描述符
52    for (i = 0; i < 3; i++) {
53        close(i);
54    }
55
56    // 打开/dev/null作为新的标准文件描述符
57    open("/dev/null", O_RDWR);
58    dup2(0, 1);
59    dup2(0, 2);
60}
61
62int main() {
63    become_daemon();
64
65    // 守护进程的主要逻辑
66    while (1) {
67        printf("守护进程正在运行...\n");
68        sleep(5);
69    }
70
71    return 0;
72}

注意事项

  • 守护进程应该能够处理信号,特别是SIGTERMSIGHUP信号。SIGTERM通常用于请求守护进程优雅地终止,而SIGHUP通常用于通知守护进程重新加载配置文件。
  • 如果守护进程需要记录日志,通常会将日志写入到一个文件中,而不是标准输出。
  • 守护进程通常需要通过命令行参数或配置文件来接受配置选项。
  • 在某些情况下,守护进程还需要处理SIGCHLD信号,以确保子进程的资源被正确清理。
  • 守护进程应该具有良好的错误处理机制,确保即使在遇到问题时也能稳定运行。

守护进程是操作系统中一个重要的组件,用于提供后台服务和支持功能。理解和掌握如何创建和管理守护进程对于开发系统服务和工具非常重要。

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/59758.shtml

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

相关文章

vue中html如何转成pdf下载,pdf转base64,忽略某个元素渲染在pdf中,方法封装

一、下载 html2Canvas jspdf npm install jspdf html2canvas二、封装转换下载方法 htmlToPdf.js import html2Canvas from html2canvas import JsPDF from jspdf/*** param {*} reportName 下载时候的标题* param {*} isDownload 是否下载默认为下载&#xff0c;传false不…

火山引擎云服务docker 安装

安装 Docker 登录云服务器。 执行以下命令&#xff0c;添加 yum 源。 yum update -y yum install epel-release -y yum clean all yum list依次执行以下命令&#xff0c;添加Docker CE镜像源。更多操作请参考Docker CE镜像。 # 安装必要的一些系统工具 sudo yum install -y yu…

CSS例子: 横向排列的格子

效果 HTML <view class"content"><view class"item" v-for"item of 5">{{item}}</view></view> CSS .content {height: 100vh;display: flex;flex-direction: row; flex-wrap: wrap;align-content: flex-start;backgro…

智能家居的未来:AI让生活更智能还是更复杂?

内容概要 智能家居的概念源于将各种家居设备连接到互联网&#xff0c;并通过智能技术进行控制和管理。随着人工智能的迅速发展&#xff0c;这一领域也迎来了前所未有的机遇。从早期简单的遥控器到如今可以通过手机应用、语音助手甚至是环境感应进行操作的设备&#xff0c;智能…

ios打包文件上传App Store windows工具

在苹果开发者中心上架IOS APP的时候&#xff0c;在苹果开发者中心不能直接上传打包文件&#xff0c;需要下载mac的xcode这些工具进行上传&#xff0c;但这些工具无法安装在windows或linux电脑上。 这里&#xff0c;我们可以不用xcode这些工具来上传&#xff0c;可以用国内的香…

ArkTS中的组件基础、状态管理、样式处理、class语法以及界面渲染

一、组件基础 1.什么是ArkTS ArkTS是HarmoyOS优选的助力应用开发的语言&#xff0c;ArkTS围绕应用开发在TypeScript&#xff08;简称TS&#xff09;生态基础上做了进一步的扩展&#xff0c;继承了TS所有的特性&#xff0c;是TS的超集。 扩展的能力如下&#xff1a; 基本语法 …

全文检索ElasticSearch到底是什么?

学习ElasticSearch之前&#xff0c;我们先来了解一下搜索 1 搜索是什么 ① 概念&#xff1a;用户输入想要的关键词&#xff0c;返回含有该关键词的所有信息。 ② 场景&#xff1a; ​ 1互联网搜索&#xff1a;谷歌、百度、各种新闻首页&#xff1b; ​ 2 站内搜索&#xff…

大众汽车合肥社招入职笔试测评SHL题库:综合能力、性格问卷、英语口语真题考什么?

大众汽车合肥社招入职笔试测评包括综合能力测试、性格问卷和英语口语测试。以下是各部分的具体内容&#xff1a; 1. **综合能力测试**&#xff1a; - 这部分测试需要46分钟完成&#xff0c;建议准备计算器和纸笔。 - 测试内容涉及问题解决能力、数值计算能力和逻辑推理能力。 -…

Docker-软件容器平台

一、容器 1、什么是容器 容器就是将软件打包成标准化单元&#xff0c;以用于开发、交付和部署 容器镜像是轻量的、可执行的独立软件包 &#xff0c;包含软件运行所需的所有内容&#xff1a;代码、运行时环境、系统工具、系统库和设置。容器化软件适用于基于 Linux 和 Windows…

Spring Boot集成Access DB实现数据导入和解析

1.什么是Access DB&#xff1f; microsoft office access是由微软发布的关联式 数据库管理系统。它结合了 microsoft jet database engine 和 图形用户界面两项特点&#xff0c;是一种关系数据库工具。它在很多地方得到广泛使用&#xff0c;例如小型企业&#xff0c;大公司的部…

WSL开发--利用Git连接远程仓库(详细步骤)

这篇文章主要介绍了如何将本地项目推送到 GitLab 上&#xff0c;并且避免每次提交都需要输入用户名和密码。文中分步讲解了配置 GitLab SSH 密钥以及配置 Git 远程仓库地址的方法。以下是文章的优化和简洁版&#xff1a; 将本地项目推送到 GitLab 并配置 SSH 免密登录 为了方便…

快消零售行业企业员工培训的数字化转型

在快速消费品&#xff08;FMCG&#xff09;行业中&#xff0c;员工培训对于保持企业的竞争力至关重要。随着电子商务的兴起和消费者行为的变化&#xff0c;快消零售行业需要不断适应新的市场趋势。数字化转型为员工培训提供了新的机遇&#xff0c;尤其是在构建在线培训知识库方…

java的体系结构

1. 题记&#xff1a; 其实很早就打算来写java的体系结构这一文章&#xff0c;但是有诸多担忧就一直搁置。其一担心自己水平有限&#xff0c;恐不能讲得太透彻&#xff0c;因为java的体系结构宏大精深。其二不知道怎么去把控文章的难度及深度&#xff0c;因为需要给大部分看&am…

基于STM32的实时时钟(RTC)教学

引言 实时时钟&#xff08;RTC&#xff09;是微控制器中的一种重要功能&#xff0c;能够持续跟踪当前时间和日期。在许多应用中&#xff0c;RTC用于记录时间戳、定时操作等。本文将指导您如何使用STM32开发板实现RTC功能&#xff0c;通过示例代码实现当前时间的读取和显示。 环…

探索开放资源上指令微调语言模型的现状

人工智能咨询培训老师叶梓 转载标明出处 开放模型在经过适当的指令调整后&#xff0c;性能可以与最先进的专有模型相媲美。但目前缺乏全面的评估&#xff0c;使得跨模型比较变得困难。来自Allen Institute for AI和华盛顿大学的研究人员们进行了一项全面的研究&#xff0c;探索…

使用k8s管理应用以及java案例

使用k8s管理应用 制作镜像控制器管理podpod数据持久化创建service四层代理创建ingress规则对外发布应用日志与监控应用案例(因无开发代码&#xff0c;最终跑不起来)编写java代码编写 Dockerfile构建 Docker 镜像在 Kubernetes 上运行应用程序创建 Kubernetes 服务service创建in…

【论文阅读笔记】CamoFormer: Masked Separable Attention for Camouflaged Object Detection

1.论文介绍 CamoFormer: Masked Separable Attention for Camouflaged Object Detection CamoFormer&#xff1a;用于隐藏目标检测的掩蔽可分离注意力 TPAMI 2024 Paper Code 2.摘要 如何从背景中识别和分割隐藏的对象是一个挑战。受transformer中多头自注意的启发&#xf…

【从零开始的LeetCode-算法】3254. 长度为 K 的子数组的能量值 I

给你一个长度为 n 的整数数组 nums 和一个正整数 k 。一个数组的 能量值 定义为&#xff1a; 如果 所有 元素都是依次 连续 且 上升 的&#xff0c;那么能量值为 最大 的元素。否则为 -1 。 你需要求出 nums 中所有长度为 k 的子数组的能量值。 请你返回一个长度为 n - k 1…

LLMs之PDF:zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略

LLMs之PDF&#xff1a;zeroX(一款PDF到Markdown 的视觉模型转换工具)的简介、安装和使用方法、案例应用之详细攻略 目录 zeroX的简介 1、支持的文件类型 zeroX的安装和使用方法 T1、Node.js 版本&#xff1a; 安装 使用方法 使用文件 URL&#xff1a; 使用本地路径&…

qt QStandardItemModel详解

1、概述 QStandardItemModel是Qt框架中提供的一个基于项的模型类&#xff0c;用于存储和管理数据&#xff0c;这些数据可以以表格的形式展示在视图控件&#xff08;如QTableView、QTreeView等&#xff09;中。QStandardItemModel支持丰富的数据操作&#xff0c;包括添加、删除…