【Linux】进程篇(补):守护进程

2023-11-08


1. 补充

1.1 查看

为了观察进程,我们以在命令提示符处,运行 sleep 命令为例。

ps axj | head -1 && ps axj | grep sleep | grep -v grep
得到的信息:
PPID:父进程 ID
PID:进程 ID
PGID:进程组
SID:会话 ID
TTY:进程关联的终端

每登录一次,都是一个新的会话,即每个会话关联一个终端文件,进程组的名称是进程组中第一个进程的 PID。

  1. 进程组,分为前台任务和后台任务
  2. 在会话中,只能有一个前台任务在运行
    (解释了我们在命令行启动一个进程的时候,bash 就无法工作了的原因)
  3. 每次登录就是创建一个新的会话、bash 任务;启动进程,就是在当前会话中创建一个后台任务;退出会话,会影响会话内部的所有任务
  4. 一般网络服务器,为了不受到用户的登陆注销的影响,网络服务器会以 守护进程 的方式运行!

1.2 控制进程组的方式

jobs:查看自己会话中后台运行的进程
fg [任务号]:将相应进程提到前台
ctrl + Z:将前台运行的进程暂停,并放入后台
bg [任务号]:运行后台暂停的进程


2. 创建守护进程

为了不受用户影响,网络服务器会将其进程单独拎出来,使用新的会话和进程组,为此称守护进程

step1. 忽略信号

signal(SIGPIPE, SIG_IGN);
signal(SIGCHLD, SIG_IGN);
// ...

step2. 让自己不是组长

要设置新的会话和进程组 ID,需要使用 setsid 接口,而每个进程组的组长(进程组号同自己 PID 的进程)是不能舍自己进程组不顾的,即使用 setsid 创建新组,必须不能是组长。

if (fork() > 0) exit(0);
  • fork出多进程,让父进程退掉,子进程继续跑,就相当于让出了组长。

  • 本质上,守护进程就是 孤儿进程 的一种

step3. setsid 函数:给调用函数设置新的会话和进程组 ID

#include <unistd.h>

pid_t setsid(void); 

返回值:

  • 成功返回新的进程组 ID,失败返回 -1,并设置错误码

注意:组长是不能使用该接口的

step4. chdir 函数:可以改变守护进程的工作路径

非必要步骤

#include <unistd.h>

int chdir(const char *path);

返回值:

  • 成功返回 0,失败返回 -1,并设置错误码

step5. 处理文件描述符 0、1、2

这里的处理是将这些文件重新向到 /dev/null 中,目的是切断新会话和键盘等的联系。

这里的 /dev/null 是一个字符设备,传进的数据都会被直接丢弃。

守护进程类样例

#include <cstdlib>
#include <unistd.h>
#include <signal.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>

void Daemon()
{
    // 1. 忽略信号
    signal(SIGPIPE, SIG_IGN);
    signal(SIGCHLD, SIG_IGN);
    
    // 2. 让自己不要成为组长
    if (fork() > 0)
        exit(0);
        
    // 3. 新建会话,自己成为会话的话首进程
    pid_t ret = setsid();
    if ((int)ret == -1)
    {
        // 日志或打印
        exit(1);
    }
    
    // 4. 可选:可以更改守护进程的工作路径
    // chdir("/")
    
    // 5. 处理后续的对于0,1,2的问题
    int fd = open("/dev/null", O_RDWR);
    if (fd < 0)
    {
        // 日志或打印
        exit(2);
    }
    dup2(fd, 0);
    dup2(fd, 1);
    dup2(fd, 2);
    close(fd);
}

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【Linux】进程篇(补):守护进程 的相关文章

  • 尽管 EXPORT_SYMBOL 模块插入时出现“模块中的未知符号”

    我正在尝试编译并插入 r8169 realtek 以太网驱动程序 我的内核版本是 ebin sony uname r 4 2 0 rc3 custom 我的本地磁盘中有相同的完整源代码 用于安装当前的内核 当我运行时该模块编译成功make
  • 字符串常量之前的预期标识符

    有一个这样的程序 include
  • 如何重新安装cudnn?

    安装Cudnn 4 0 4后 我发现如果我想运行我下载的代码 我需要更高版本的Cudnn 然后我下载 cudnn 7 0 linux x64 v4 0 prod tgz 并直接按以下顺序安装 sudo cp include cudnn h
  • gai_cancel() 需要很长时间才能成功

    我正在尝试在 C 中异步查找域 原因是我希望能够有效地添加超时期限 以防系统无法查找域 我遇到了 getaddrinfo a 命令 所以我决定尝试一下 然而 在我的机器上取消任何不会成功的 dns 查找 例如没有互联网连接时 永远不会花费少
  • 如何使用Python distutils?

    我用 python 编写了一个快速程序 将 gtk GUI 添加到 cli 程序中 我想知道如何使用 distutils 创建安装程序 因为它只是命令行应用程序的 GUI 前端 所以它只能在 nix 中工作 所以我不担心它是跨平台的 我的主
  • 为什么不使用 sshrc 中设置的 $PATH?

    我正在尝试在 OS X 服务器上通过 ssh 设置 svn 为了做到这一点 我读到我需要一个包装器来设置 umask 并 在我的例子中 设置存储库根 一种快速而肮脏的方法是重命名 usr bin svnserve并将包装器脚本放置在该位置
  • 很好的 C 库集合? [关闭]

    Closed 这个问题正在寻求书籍 工具 软件库等的推荐 不满足堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个很好的 ANSI C 库集合 用于处理向量 哈希映射 二进制树 字符串处理等 Try g
  • 我应该如何从非 root Debian Linux 守护进程登录?

    我正在编写一个新的守护进程 它将托管在 Debian Linux 上 我发现 var log 具有仅 root 写入权限 因此我的守护进程无法在那里写入日志文件 但是 如果它写入那里 它似乎将获得自动日志轮转 并且也按照用户期望的方式工作
  • python中的多服务器监控/自动重启

    我有 2 个服务器程序 必须使用 GNU Screen 启动 我想使用基于 Python 的程序来强化这些服务器 防止崩溃 该程序启动每个屏幕会话 然后监视服务器进程 如果服务器进程崩溃 我需要 python 代码来终止无关的屏幕会话并再次
  • 如何配置和采样英特尔进程内性能计数器

    简而言之 我试图在用户级基准测试进程中实现以下目标 伪代码 假设 x86 64 和 UNIX 系统 results for iteration 0 iteration lt num iterations iteration pctr sta
  • Zip 实用程序在 Linux 中每次都给我不同的 md5sum

    当我在 Linux 中压缩 Zip 2 31 同一个文件时 每次都会得到不同的校验和 如何保持上次的 md5sum 相同 我正在使用 yum 提供的最新 zip 更新 生成的存档不仅包含压缩文件数据 还包含 额外的文件属性 如参考zip 文
  • 如何在多行而不是单行输出上打印 Linux 组名称

    我尝试过 getent group 命令 id Gn user 和一些 sed 组合 但我认为我无法实现 因此向其他程序员伸出援手 我希望能够打印此 groups abc123输出 abc123 devops 构建测试设计 预期输出 gro
  • 32 位 x86 汇编中堆栈对齐的职责

    我试图清楚地了解谁 调用者或被调用者 负责堆栈对齐 64 位汇编的情况相当清楚 它是由caller 请参阅系统 V AMD64 ABI 第 3 2 2 节栈帧 输入参数区域的末尾应按 16 对齐 32 如果 m256 在堆栈 字节边界上传递
  • 如何安装 Node 和 NPM 以便不必使用 sudo?

    我正在尝试在 Ubuntu 14 04 计算机上设置 Node js 和 NPM 但遇到了一些问题 在我的第一次尝试中 我不断得到EACCES尝试安装软件包时出错 有时甚至使用sudo 所以我彻底卸载了node和npm 现在我正在尝试找出如
  • 如何在不需要设置 LD_LIBRARY_PATH shell 变量的情况下输入“cargo run”?

    我构建了一个 Rust 程序 通过 C 接口调用 C 函数 为了执行该程序 我必须运行 export LD LIBRARY PATH
  • 生成(非常)大的非重复整数序列而不进行预洗牌

    背景 我编写了一个简单的媒体客户端 服务器 我想生成一个不明显的时间值 随从客户端到服务器的每个命令一起发送 时间戳中将包含相当多的数据 纳秒分辨率 即使它不是真正准确 因为现代操作系统中计时器采样的限制 等 我想做的 在 Linux 上
  • 如何可视化包含/指向彼此的 C 结构图?

    我正在使用Ubuntu 10 04 正在研究内核对象的编程 我遇到了一些相当复杂的结构 我很难阅读 所以我想我应该尝试找到一些可以帮助我可视化它们的工具 到目前为止我唯一能找到的是VCG http rw4 cs uni sb de sand
  • 如何解决错误:psycopg2 构建轮失败?

    我遇到问题了psycopg2 的构建轮子 thru pip install r requirements txt 我使用的是 ubuntu 20 04 python 3 8 5 venv 这是我的要求 txt amqp 2 6 1 anyj
  • java轻量级调试器[关闭]

    Closed 这个问题不符合堆栈溢出指南 help closed questions 目前不接受答案 我正在寻找一个轻量级的 java 调试器 无论是在 IDE 中还是独立的 命令行或 GUI 中 我正在使用 ant 和 vim 并且尝试过
  • 如何从 Windows 反编译 Linux 二进制文件?

    如何从 Windows 反编译 Linux 二进制文件 so 谢谢 你可以试试回旋镖 http boomerang sourceforge net 您需要首先从源代码构建它 因为提供的二进制文件不涵盖这种情况 如果您绝对拒绝编译任何内容 请

随机推荐

  • 集成学习笔记

    集成学习通过结合规则 使用一系列弱学习器来组成一个强学习器 集成学习通常有两个步骤 ensemble generation 和 ensemble integration 通常在两个步骤之间会有一个 pruning process 剪枝过程
  • LeetCode--初级算法--环形链表

    题目 给定一个链表 判断链表中是否有环 为了表示给定链表中的环 我们使用整数 pos 来表示链表尾连接到链表中的位置 索引从 0 开始 如果 pos 是 1 则在该链表中没有环 示例 1 输入 head 3 2 0 4 pos 1 输出 t
  • Excel条件格式化(conditional formatting)应用

    简介 条件格式化顾名思义就是根据条件对单元格进行格式化 填充 字体等 比如我们有一个学生成绩表 根据需要我们要把成绩按 不及格 lt 60 良好 gt 60且 lt 90 优秀 gt 90 进行颜色标注 第一步 如图 第二步 如图 点击 确
  • OpenMP task 原理与实例

    个人理解 Openmp自从3 0以后全面走向任务驱动 task机制非常重要 可以显式定义任务 而其余parallel代码块中不用task定义的实际上是隐式任务 抽象来说就是有两个池子 线程池与任务池 闲置的线程会在线程池等待任务 显式任务与
  • Servlet登录注册(IDEA)

    user类 提供get set 有参 无参 toString方法 UserDao层 UserDaoImpl层 登录 注册是否重复 真正的注册 UserService层 登录LoginServlet层 注册和注册用户唯一的ZcServlet层
  • html,css,js简单介绍,html常用标签

    目录 简单介绍 HTML常用标签 1 html骨架标签 2 标题标签 3 段落标签 4 换行标签 5 文本格式化标签 6 div标签 span标签和pre标签 7 图像标签 8 超链接标签 9 注释标签 10 表格标签 11 列表标签 12
  • Geometry Shader 概念和实例

    前言 Shader Model 4给我们带来了Geometry Shader这个玩意儿 其实这个东西早就在一些3D动画制作软件中存在了 比如Maya 8 我参考了以前DX10的哪一篇Preview与Csustan edu的一篇比较详尽的教材
  • C语言实现url解析小实例

    一 前言 前面一口君写了一篇关于url的文章 一文带你理解URI 和 URL 有什么区别 本篇在此基础上 编写一个简单的用于解析url的小例子 最终目标是解析出URL中所有的数据信息 二 库函数 用到的几个库函数如下 1 strncasec
  • Dota数据集介绍

    文章目录 前言 DOTA数据集介绍 DOTAV1 0 DOTAV1 5 DOTAV2 0 标注方式 Task1 Detection with oriented bounding boxes Task2 Detection with hori
  • 基于Android+OpenCV+CNN+Keras的智能手语数字实时翻译——深度学习算法应用(含Python、ipynb工程源码)+数据集(四)

    目录 前言 总体设计 系统整体结构图 系统流程图 运行环境 模块实现 1 数据预处理 2 数据增强 3 模型构建 4 模型训练及保存 5 模型评估 6 模型测试 1 权限注册 2 模型导入 3 总体模型构建 4 处理视频中的预览帧数据 5
  • erlang 实现二叉树

    此为一练习题 为 Erlang程序设计 第7章后的练习题 7 5 二叉树记录 建立二叉树 ifdef debug define DBG Str Args io format Str Args else define DBG Str Args
  • 20230626 数学

    1 极大似然估计 Maximum likelihood estimation 最大似然估计 大道上的头陀的博客 CSDN博客 极大似然估计的应用场景 极大似然估计 Maximum Likelihood Estimation MLE 是统计学
  • [leetcode 周赛 148] 1144 递减元素使数组呈锯齿状

    目录 1144 Decrease Elements To Make Array Zigzag 递减元素使数组呈锯齿状 描述 思路 代码实现 1144 Decrease Elements To Make Array Zigzag 递减元素使数
  • vue实现简单搜索功能

    目录 1 概述 2 功能逻辑 2 1功能流程 2 2 流程图 3 功能实现 3 1 vue组件化 3 2 代码 3 3 动态效果 1 概述 在vue项目中 搜索功能是我们经常需要使用的一个场景 最常用的是在列表数据中搜索一个想要的 今天的例
  • C语言stat()函数:获取文件状态

    C语言stat 函数 获取文件状态 相关函数 fstat lstat chmod chown readlink utime 头文件 include
  • 【Bcos】create BcosSDK failed, error info: init channel network error

    create BcosSDK failed error info init channel network error Try init the sslContext failed Try init the sslContext faile
  • 功能强大的国产Api管理工具

    前言 如果你是一名Java后端开发工程师 像Swagger Postman RAP这些工具 应该再熟悉不过了吧 为我们的接口开发工作带来了很多的便捷 不过因为这些都是独立的框架 之间并不存在互通性 因此在多个框架间协调的时候 不可避免的会带
  • Anaconda下Jupyter Notebook执行OpenCV中cv2.imshow()报错(错误码为1272)网上解法汇总记录和最终处理方式

    零 我设备的相关信息 Python 3 8 8 Anaconda3 2021 05 查询匹配python3 8 的OpenCV匹配版本为 4 1 4 2 我最后安装4 2 0 32版本 如下我记录了 从发现问题 到不断试错 最后解决问题 的
  • 电视制式 NTSC PAL SECAM

    电视制式 电视的制式是指电视信号的标准 目前各国的电视制式不尽相同 如附件1 2 制式的区分主要在于其帧频 场频 的不同 分解率的不同 信号带宽以及载频的不同 色彩空间的转换关系不同等 电视制式现在有模拟和数字信号和数字信号两种 模拟制式一
  • 【Linux】进程篇(补):守护进程

    文章目录 1 补充 1 1 查看 1 2 控制进程组的方式 2 创建守护进程 step1 忽略信号 step2 让自己不是组长 step3 setsid 函数 给调用函数设置新的会话和进程组 ID step4 chdir 函数 可以改变守护
Powered by Hwhale