【linuxC语言】守护进程

news/2024/10/11 13:25:32/
cle class="baidu_pl">
cle_content" class="article_content clearfix">
content_views" class="markdown_views prism-atom-one-dark">cap="round" d="M5,0 0,2.5 5,5z" id="raphael-marker-block" style="-webkit-tap-highlight-color: rgba(0, 0, 0, 0);">

class="toc">

文章目录

  • 前言
  • 一、守护进程的介绍
  • 二、开启守护进程
  • 总结


前言

在Linux系统中࿰c;守护进程是在后台运行的进程࿰c;通常以服务的形式提供某种功能࿰c;如网络服务、系统监控等。守护进程的特点是在启动时脱离终端并且在后台运行࿰c;它们通常不与用户交互࿰c;也不会受到终端关闭的影响。编写一个守护进程需要考虑很多方面࿰c;包括正确处理文件描述符、设置正确的工作目录、处理信号等。


一、守护进程的介绍

在Linux系统中࿰c;守护进程是在后台运行的进程࿰c;通常以服务的形式提供某种功能࿰c;如网络服务、系统监控等。守护进程的特点是在启动时脱离终端并且在后台运行࿰c;它们通常不与用户交互࿰c;也不会受到终端关闭的影响。

守护进程的设计旨在提供长期运行的服务࿰c;它们通常会在系统启动时由启动脚本启动࿰c;并在系统关闭时由关闭脚本关闭。守护进程通常具有较高的权限࿰c;可以访问系统资源和执行特权操作࿰c;因此编写一个守护进程需要小心谨慎࿰c;确保它们能够正确地在后台运行并提供所需的功能。

为了保证守护进程的正常运行࿰c;通常会有一些设计原则需要遵循࿰c;比如:

脱离终端控制: 守护进程在启动时会脱离终端控制࿰c;这意味着它们不再依赖于任何终端会话࿰c;并且不会收到终端的信号。
更改工作目录: 为了避免卸载挂载的文件系统引起的问题࿰c;守护进程通常会将工作目录更改为根目录 / 或其他安全目录。
关闭文件描述符: 守护进程需要关闭从父进程继承的所有文件描述符࿰c;以避免在后台运行时意外地访问文件或终端。
捕获和处理信号: 守护进程通常会捕获并处理一些特定的信号࿰c;如 SIGTERM 用于优雅地关闭进程。
日志记录: 为了方便排错和监控࿰c;守护进程通常会将日志信息记录到日志文件中࿰c;而不是直接打印到终端。
总的来说࿰c;守护进程在Linux系统中扮演着重要的角色࿰c;它们为系统提供了各种服务和功能࿰c;并且通常是系统中运行时间最长的进程之一。

在Linux系统中࿰c;守护进程就像是一种静默的服务员࿰c;他们默默地在后台工作࿰c;为系统提供各种服务࿰c;比如网络连接、文件传输等。你可以把它们想象成是一个不需要你亲自操作的小助手࿰c;它们会在系统启动时自动启动࿰c;并且一直保持运行࿰c;直到系统关闭。

守护进程的特点是它们不需要你的直接干预࿰c;不会出现在你的屏幕上࿰c;也不会主动向你发出提示。它们可以在你不知不觉中为你服务࿰c;就像是一个隐形的工作者一样࿰c;默默地工作在系统的后台࿰c;为系统的稳定和安全提供保障。

当你使用网络服务、文件传输等功能时࿰c;实际上就是在和守护进程打交道࿰c;虽然你看不到它们࿰c;但它们默默地为你提供了这些服务。所以࿰c;尽管它们可能不引人注目࿰c;但它们在系统运行中扮演着至关重要的角色。

二、开启守护进程

我们可以调用<code>setsidcode>函数把当前进程开启为守护进程

下面是一个简单的示例代码࿰c;演示了如何编写一个守护进程:

<code class="prism language-c">class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><stdio.h>
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><stdlib.h>
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><unistd.h>
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><sys/types.h>
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><sys/stat.h>
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><fcntl.h>
class="token macro property">class="token directive-hash">#class="token directive keyword">include class="token string"><syslog.h>class="token macro property">class="token directive-hash">#class="token directive keyword">define class="token macro-name">LOG_FILE class="token string">"/E/LinuxC/pid/my.log"class="token keyword">void class="token function">daemonizeclass="token punctuation">(class="token punctuation">) class="token punctuation">{class="token class-name">pid_t pidclass="token punctuation">;class="token comment">// 创建子进程࿰c;父进程退出pid class="token operator">= class="token function">forkclass="token punctuation">(class="token punctuation">)class="token punctuation">;class="token keyword">if class="token punctuation">(pid class="token operator">< class="token number">0class="token punctuation">) class="token punctuation">{class="token function">exitclass="token punctuation">(EXIT_FAILUREclass="token punctuation">)class="token punctuation">;class="token punctuation">}class="token keyword">if class="token punctuation">(pid class="token operator">> class="token number">0class="token punctuation">) class="token punctuation">{class="token function">exitclass="token punctuation">(EXIT_SUCCESSclass="token punctuation">)class="token punctuation">;class="token punctuation">}class="token comment">// 在新会话中启动子进程class="token keyword">if class="token punctuation">(class="token function">setsidclass="token punctuation">(class="token punctuation">) class="token operator">< class="token number">0class="token punctuation">) class="token punctuation">{class="token function">exitclass="token punctuation">(EXIT_FAILUREclass="token punctuation">)class="token punctuation">;class="token punctuation">}class="token comment">// 关闭标准输入、输出、错误流class="token function">closeclass="token punctuation">(STDIN_FILENOclass="token punctuation">)class="token punctuation">;class="token function">closeclass="token punctuation">(STDOUT_FILENOclass="token punctuation">)class="token punctuation">;class="token function">closeclass="token punctuation">(STDERR_FILENOclass="token punctuation">)class="token punctuation">;class="token comment">// 打开日志文件class="token function">openlogclass="token punctuation">(class="token string">"mydaemon"class="token punctuation">, LOG_PIDclass="token punctuation">, LOG_DAEMONclass="token punctuation">)class="token punctuation">;
class="token punctuation">}class="token keyword">int class="token function">mainclass="token punctuation">(class="token punctuation">) class="token punctuation">{class="token comment">// 守护进程化class="token function">daemonizeclass="token punctuation">(class="token punctuation">)class="token punctuation">;class="token comment">// 写入日志文件class="token function">syslogclass="token punctuation">(LOG_INFOclass="token punctuation">, class="token string">"My daemon started."class="token punctuation">)class="token punctuation">;class="token comment">// 守护进程主循环class="token keyword">while class="token punctuation">(class="token number">1class="token punctuation">) class="token punctuation">{class="token comment">// 执行守护进程任务࿰c;这里简单地每隔5秒写入一条日志class="token function">syslogclass="token punctuation">(LOG_INFOclass="token punctuation">, class="token string">"Heartbeat"class="token punctuation">)class="token punctuation">;class="token function">sleepclass="token punctuation">(class="token number">5class="token punctuation">)class="token punctuation">;class="token punctuation">}class="token keyword">return EXIT_SUCCESSclass="token punctuation">;
class="token punctuation">}code>

c="https://img-blog.csdnimg.cn/direct/dfa61058e88c4584906eae39d9c5cddd.png#pic_center" alt="在这里插入图片描述" />


总结

通过本文的介绍࿰c;我们了解了守护进程在Linux系统中的重要性以及编写它们的一般步骤。守护进程的编写需要小心谨慎࿰c;确保它们能够正确地在后台运行并提供所需的功能。在实际编程中࿰c;需要注意的一些关键点包括正确处理文件描述符、设置正确的工作目录、以及处理信号等。编写一个稳健的守护进程可以为系统的稳定性和性能提供有力支持。


http://www.ppmy.cn/news/1455553.html

相关文章

Vue笔记 4

内置指令 1.v-text_指令 我们学过的指令&#xff1a; ​ v-bind : 单向绑定解析表达式, 可简写为 :xxx ​ v-model : 双向数据绑定 ​ v-for : 遍历数组/对象/字符串 ​ v-on : 绑定事件监听, 可简写为 ​ v-if : 条件渲染&#xff08;动态控制节点是否存存在&#xff0…

【C++】学习笔记——string_3

文章目录 六、string类5. string类的操作6. string类的转换7. string类的模拟实现 未完待续 搭配文档食用 六、string类 5. string类的操作 上面的函数中&#xff0c;有些是不常用的&#xff0c;咱们只挑几个重要的进行讲解。 c_str 就是将字符串转换成 C语言 字符串的格式。…

红米1s 刷入魔趣 (Mokee)ROM(Android 7.1)

目录 背景准备工具硬件&#xff08;自己准备&#xff09;软件&#xff08;我会在文末提供链接&#xff09; 刷机步骤1. 重启电脑2. 安装驱动3. 刷入TWRP4. 清空数据5. 刷入魔趣6. 开机 结尾下载链接 本文由Jzwalliser原创&#xff0c;发布在CSDN平台上&#xff0c;遵循CC 4.0 B…

esp32-cam 1. 出厂固件编译与测试

0. 环境 - ubuntu18 - esp32-cam - usb转ttl ch340 硬件连接 esp32-camch340板子U0RTXDU0TRXDGNDGND5V5V 1. 安装依赖 sudo apt-get install vim sudo apt install git sudo apt-get install git wget flex bison gperf python python-pip python-setuptools python-serial p…

Flink时间语义 | 大数据技术

⭐简单说两句⭐ ✨ 正在努力的小叮当~ &#x1f496; 超级爱分享&#xff0c;分享各种有趣干货&#xff01; &#x1f469;‍&#x1f4bb; 提供&#xff1a;模拟面试 | 简历诊断 | 独家简历模板 &#x1f308; 感谢关注&#xff0c;关注了你就是我的超级粉丝啦&#xff01; &a…

基于TL431和CSA的恒压与负压输出

Hello uu们,51去那里玩了呀?该收心回来上班了,嘿嘿! 为什么会有这个命题,因为我的手头只有这些东西如何去实现呢?让我们一起来看电路图吧.电路图如下图1所示 图1:CSA恒压输出电路 图1中,R1给U2提供偏置,Q1给R1提供电流,当U1-VOUT输出大于2.5V时候,U2内部的三极管CE导通,使得…

秋招后端开发面试题 - MySQL事务

目录 MySQL事务前言面试题什么是数据库事务为什么要有事务呢&#xff1f;项目中遇到的事务事务的传播机制事务的特性&#xff1f;事务并发存在的问题四大隔离级别四大隔离级别&#xff0c;都会存在哪些并发问题呢数据库是如何保证事务的隔离性的呢&#xff1f;如何解决加锁后的…

【StarRocks系列】 Trino 方言支持

我们在之前的文章中&#xff0c;介绍了 Doris 官方提供的两种方言转换工具&#xff0c;分别是 sql convertor 和方言 plugin。StarRocks 目前同样也提供了类似的方言转换功能。本文我们就一起来看一下这个功能的实现与 Doris 相比有何不同。 一、Trino 方言验证 我们可以通过…