【linux 多进程并发】0301 Linux创建后台服务进程,daemon进程,自己的进程可以被一号进程接管啦

news2024/10/22 21:38:27

0301 Linux创建后台进程

专栏内容

  • postgresql使用入门基础
  • 手写数据库toadb
  • 并发编程

个人主页:我的主页
管理社区:开源数据库
座右铭:天行健,君子以自强不息;地势坤,君子以厚德载物.

在这里插入图片描述

一、概述


开发一款服务端程序,它往往以服务进程方式运行,也就是我们常说的后台进程。

在linux 下使用top命令,可以看到实际已经有很多的进程一直在运行中,这些进程就是后台服务进程。

那么如何让自己的程序以后台服务进程的方式运行呢, 同时如何管理后台服务进程,对它们进程启动,重启,停止等操作,

本节内容就来详细聊一聊后台服务进程的那些事儿。

二、创建后台服务进程原理


我们先来用ps命令看一个后台进程;

[senllang@hatch src]$ ps -ef|grep toadb |grep -v grep
senllang  703064       1  0 Oct14 pts/16   00:07:09 ./toadb-0-01 -M 2

toadb是一个数据库,它在后台运行,是一个从零开始手写的数据库,详细介绍见toadb基础架构模型,想练手的同学可以关注toadb专栏。

可以看到后台服务进程的进程PID为703064,而父进程PID为1;

我们再来看一下1号进程是什么?

[senllang@hatch src]$ ps -ef|more
UID          PID    PPID  C STIME TTY          TIME CMD
root           1       0  0 Oct08 ?        00:00:17 /usr/lib/systemd/systemd --switched-root --system --deserialize 18

可以看到1号进程,就是systemd服务进程。

根据之前开始介绍linux进程家族体系的内容,1号进程是所有用户进程起源;

同时一个进程的父进程提前结束时,它就会被1号进程接管,也就是自动变化1号进程的子进程,此时就会转到后台运行。

三、创建后台服务进程的方法


让程序在后台执行,我们知道有很多方法,如在执行命令后面加 &, 使用 nohup命令,或者是 bg命令等等,

但这些仅仅是程序在后台执行,而程序的父进程还是当前的shell窗口,当shell关闭时,程序也有可能会结束。

在这里插入图片描述

如何创建一个后台服务进程,或者叫做 daemon进程,让它的父进程为systemd进程,下面就一起来看看。

3.1 程序代码

下面我们编写一段演示程序。

/*
 * ex020301_daemon.c
 */
#include <stdio.h>
#include <stdlib.h>

#include <sys/types.h>
#include <unistd.h>

#include <errno.h>
#include <string.h>

void daemon_fork();

int main(int argc ,char *argv[])
{
        daemon_fork();

        sleep(10);

        return 0;
}

void daemon_fork()
{
        int pid = -1;
        pid = fork();
        if(pid < 0)
        {
                printf("fork error[%s]\n",strerror(errno));
                exit(-1);
        }
        else if(pid > 0)
        {
                // parent exit.
                exit(0);
        }
        else
        {
                // child daemon
                return;
        }
}

说明

  • daemon进程主要在daemon_fork函数中,函数返回后,当前就在daemon进程中;
  • 用sleep(10)来模拟服务进程的处理,可以用实际的服务程序代码替代;

下面看看daemon_fork函数,

  • 用fork创建了一个子进程,这与前几节介绍的fork示例类似;
  • 在父进程分支中,直接调用exit退出了;
  • 而子进程分支中,我们选择了函数返回;也就是调用该函数后,后续的代码是子进程中执行了;

3.2 运行分析

编译执行

[senllang@hatch ex_0201]$ gcc ex020301_daemon.c -o extest
[senllang@hatch ex_0201]$ ./extest &
[1] 1074458

我们使用后台执行,可以看到后台任务号为1。

后台进程情况查看

[senllang@hatch ex_0201]$ ps -ef|grep extest |grep -v grep 
senllang 1074459       1  0 08:44 pts/8    00:00:00 ./extest

[1]+  Done                    ./extest

可以看到当前进程PID为 1074459, 而父进程PID为1,也就是它已经被systemd接管了。

原理分析

当我们创建子进程后,父进程不会等待子进程,而是直接结束了,此时子进程就会被systemd接管了,

也就是作为后台服务进程继续运行,最终子进程退出时资源回收由systemd进程来负责。

四、总结


通常我们在终端启动程序,该程序的父进程一般是终端进程,这样在终端退出时,会产生像SIGHUG信号发给所有子进程,子进程默认处理是退出。

我们要创建后台服务进程时,必需让进程与终端无关,这就是示例代码中经过一次fork之后,父进程退出,而子进程让systemd接管的真正作用。

本章节代码位于gitcode, 路径为: multiProcess/ex02_multiprocess, 有兴趣的同学可以下载测试,当然别忘了点个小星星。

结尾


非常感谢大家的支持,在浏览的同时别忘了留下您宝贵的评论,如果觉得值得鼓励,请点赞,收藏,我会更加努力!

作者邮箱:study@senllang.onaliyun.com
如有错误或者疏漏欢迎指出,互相学习。

注:未经同意,不得转载!

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

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

相关文章

Matlab实现鲸鱼优化算法(WOA)求解路径规划问题

目录 1.内容介绍 2.部分代码 3.实验结果 4.内容获取 1内容介绍 鲸鱼优化算法&#xff08;WOA&#xff09;是一种受自然界座头鲸捕食行为启发的优化算法&#xff0c;它通过模拟座头鲸的环绕猎物、螺旋游动和搜索猎物三种主要行为来探索和优化问题的解。WOA因其强大的全局搜索能…

RabbitMQ最新版本4.0.2在Windows下的安装及使用

RabbitMQ 是一个开源的消息代理和队列服务器&#xff0c;提供可靠的消息传递和队列服务。它支持多种消息协议&#xff0c;包括 AMQP、STOMP、MQTT 等。本文将详细介绍如何在 Windows 系统上安装和使用最新版本的 RabbitMQ 4.0.2。 前言 RabbitMQ 是用 Erlang 语言开发的 AMQP&…

攻坚金融关键业务系统,OceanBase亮相2024金融科技大会

10月15-16日&#xff0c;第六届中新数字金融应用博览会与2024金融科技大会&#xff08;简称“金博会”&#xff09;在苏州工业园区联合举办。此次大会融合了国家级重要金融科技资源——“中国金融科技大会”&#xff0c;围绕“赋能金融高质量发展&#xff0c;金融科技创新前行”…

如何实现金蝶商品数据集成到电商系统的SKU

如何实现金蝶商品数据集成到电商SKU系统 金蝶商品数据集成到电商SKU的技术实现 在现代企业的数据管理中&#xff0c;系统间的数据对接与集成是提升业务效率和准确性的关键环节。本文将分享一个实际案例&#xff1a;如何通过轻易云数据集成平台&#xff0c;将金蝶云星辰V2中的商…

Gin框架操作指南06:POST绑定(下)

官方文档地址&#xff08;中文&#xff09;&#xff1a;https://gin-gonic.com/zh-cn/docs/ 注&#xff1a;本教程采用工作区机制&#xff0c;所以一个项目下载了Gin框架&#xff0c;其余项目就无需重复下载&#xff0c;想了解的读者可阅读第一节&#xff1a;Gin操作指南&#…

idea删除git历史提交记录

前言&#xff1a;此文章是我在实际工作中有效解决问题的方法&#xff0c;做记录的同时也供大家参考&#xff01; 一、 首先&#xff0c;通过idea的终端或系统的cmd控制台&#xff0c;进入到你的项目文件根目录&#xff0c;idea终端默认就是项目根目录。 二、确保你当前处于要删…

浙大恩特CRM Quotegask_editAction SQL注入漏洞复现

0x01 产品描述&#xff1a; 浙大恩特CRM是由浙江大学恩智浙大科技有限公司推出的客户关系管理&#xff08;CRM&#xff09;系统。该系统旨在帮助企业高效管理客户关系&#xff0c;提升销售业绩&#xff0c;促进市场营销和客户服务的优化。 0x02 漏洞描述&#xff1a; 浙大恩特…

​​Spring6梳理19——基于注解管理Bean之@Autowired注入

以上笔记来源&#xff1a; 尚硅谷Spring零基础入门到进阶&#xff0c;一套搞定spring6全套视频教程&#xff08;源码级讲解&#xff09;https://www.bilibili.com/video/BV1kR4y1b7Qc 目录 19.1 Autowired注入 ①场景一&#xff1a;属性注入 19.1.1创建UserDao接口 19.1.2…

如何将数据从 AWS S3 导入到 Elastic Cloud - 第 2 部分:Elastic Agent

作者&#xff1a;来自 Elastic Hemendra Singh Lodhi 了解将数据从 AWS S3 提取到 Elastic Cloud 的不同选项。 这是多部分博客系列的第二部分&#xff0c;探讨了将数据从 AWS S3 提取到 Elastic Cloud 的不同选项。 在本博客中&#xff0c;我们将了解如何使用 Elastic Agent…

OQE-OPTICAL AND QUANTUM ELECTRONICS

文章目录 一、征稿简介二、重要信息三、服务简述四、投稿须知五、联系咨询 一、征稿简介 二、重要信息 期刊官网&#xff1a;https://ais.cn/u/3eEJNv 三、服务简述 四、投稿须知 1.在线投稿&#xff1a;由艾思科蓝支持在线投稿&#xff0c;请将文章全文投稿至艾思科蓝投稿系…

【Linux】————动静态库

作者主页&#xff1a; 作者主页 本篇博客专栏&#xff1a;Linux 创作时间 &#xff1a;2024年10月22日 一&#xff0e;库的定义 什么是库&#xff0c;在windows平台和linux平台下都大量存在着库。 本质上来说库是一种可执行代码的二进制形式&#xff0c;可以被操作系统载…

虚拟机网络设置为桥接模式

1、打开VMware Workstation Pro&#xff0c;点击“虚拟机—设置”&#xff0c;进入虚拟机设置页面 2、点击“网络适配器”&#xff0c;网络连接选择桥接模式 3、点击“编辑—虚拟网络编辑器”&#xff0c;进入虚拟网络编辑器页面 4、选择桥接模式&#xff0c;并选择要桥接到的…

Flux.using 使用说明书

using public static <T,D> Flux<T> using(Callable<? extends D> resourceSupplier,Function<? super D,? extends Publisher<? extends T>> sourceSupplier,Consumer<? super D> resourceCleanup)Uses a resource, generated by a…

创建人物状态栏

接下来&#xff0c;我们来尝试制作一下我们的UI&#xff0c;我们会学习unity基本的UI系统 ************************************************************************************************************** 我们要先安装一个好用的插件到我们的unity当中&#xff0c;帮助…

Mac电脑:资源库Library里找不到WebServer问题的解决

今天看到一本书里写到Windows电脑自带IIS Web服务器&#xff0c;好奇了一下下&#xff0c;mac电脑自带的又是什么服务器呢&#xff1f;经查询&#xff0c;原来是Apache服务器&#xff0c;这个名字我很熟悉。只是如何设置呢&#xff1f;我从来没用过&#xff0c;于是试验了一番。…

[Linux进程概念]命令行参数|环境变量

目录 一、命令行参数 1.什么是命令行参数 2.为什么要有命令行参数 &#xff08;1&#xff09;书写的代码段 &#xff08;2&#xff09;实际的代码段 3.Linux中的命令行参数 二、环境变量 1.什么是环境变量&#xff1f; 2.获取环境变量 &#xff08;1&#xff09;指令…

OceanBase 的写盘与传统数据库有什么不同?

背景 在数据库开发过程中&#xff0c;“写盘”是一项核心操作&#xff0c;即将内存中暂存的数据安全地转储到磁盘上。在诸如MySQL这样的传统数据库管理系统中&#xff0c;写盘主要有以下几步&#xff1a;首先将数据写入缓存池&#xff1b;其次&#xff0c;为了确保数据的完整性…

【Qt】控件——Qt输入类控件、常见的输入类控件、输入类控件的使用、Line Edit、Text Edit、Combo Box、Spin Box

文章目录 Qt5. Qt显示类控件Line EditText EditCombo BoxSpin BoxQDateTimeEditDialSlider Qt 5. Qt显示类控件 Line Edit QLineEdit 用于表示单行输入框。可以输入一段文本&#xff0c;但是不能换行。 属性说明text输入框中的文本inputMask输入内容格式约束maxLength最大长度…

【HAD】Half-Truth: A Partially Fake Audio Detection Dataset

文章目录 Half-Truth: A Partially Fake Audio Detection Dataset背景key points研究数据集设计评价指标实验基线:utterance-level分类(话语级)基线:segment-level分类(片段级)Half-Truth: A Partially Fake Audio Detection Dataset 会议/期刊:Interspeech 2021 CCF-C…

哈佛医学生一个月吃720个鸡蛋,结果发现......

你们听说过吃鸡蛋还能降低胆固醇的操作吗&#xff1f; 前段时间&#xff0c;哈佛医学院的学生尼克诺尔维茨&#xff08;Nick Norwitz&#xff09;就做了这样一个实验&#xff0c;得出的结果让大家震惊&#xff01; 许多人认为狂吃鸡蛋不会有好处&#xff0c;因为这会摄入大量胆…