守护进程

ops/2025/2/12 14:40:36/

什么是守护进程

守护进程,简单来说就是让进程脱离当前会话,成为孤儿进程且在后台不间断运行
服务器服务进程应该为守护进程

如何成为守护进程?

系统daemon接口:

#include <unistd.h>int daemon(int nochdir, int noclose);

调用daemon的进程本身不能是pregress leader

进程的前后台切换

任何时候,只能一个前台,接收bash 的I/O

进程放到后台

启动进程时,命令末尾加&

对于已经启动的进程 Ctrl + z 暂停进程, 之后使用bg %任务编号

(不知名任务编号默认最近一个, 任务编号可jobs查看)

后台进程切到前台

fg

fd %1 (任务编号可以jobs查看)

 进程组/任务

进程组是为了完成一个任务的一组任务
[ps ajs 运行结果与结果参数说明图片]:


PGID:Progress Group ID
SID:Session ID
TTY: TeleTYpewriter
TPGID:Terminal Progress Group ID

TTY(Teletypewriter)指进程所连接的终端设备。

  • 如果进程与终端关联,显示终端名称(如 pts/0tty1)。

  • 如果进程与终端无关,显示 ?


会话

我们连接到一个网站时,云服务器会给每个用户创建一个session&bash,这叫做会话。同一个会话拥有相同session(SID)

用户退出时,系统释放会话,可能会影响后台进程组(如提供服务进程)。要使服务进程在用户退出时正常运行,就要将其设置为守护进程

守护进程属于独立会话(和用户不同session/SID),这样server进程不会随用户退出而收到影响(这里的影响不一定使程序直接退出,但是I/O等功能可能异常)

守护进程要脱离终端
其实就是一个孤儿进程

手动实现daemon

手写daemon在很多实际情况中,是有必要的

code
#pragma once#include <iostream>
#include <cstdlib>
#include <signal.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/types.h>
#include <sys/stat.h>#define ROOT "/"
#define devnull "/dev/null"void Daemon(bool ischdir, bool isclose)
{// 1. 守护进程一般要屏蔽到特定的异常信号signal(SIGCHLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);// 2. 成为非组长if (fork() > 0)exit(0);// 3. 建立新会话setsid();// 4. 每一个进程都有自己的CWD,是否将当前进程的CWD更改成为 / 根目录if (ischdir)chdir(ROOT);// 5. 已经变成守护进程啦,不需要和用户的输入输出,错误进行关联了if (isclose){::close(0);::close(1);::close(2);}else{int fd = ::open(devnull, O_WRONLY);if (fd > 0){// 各种重定向dup2(fd, 0);dup2(fd, 1);dup2(fd, 2);close(fd);}}
}
tips:

[setid]
使用setid的进程不能是progress leader,解决方法:fork后kill父,使用子来setid

/dev/null  黑洞文件
被读时丢弃所有得到数据
被写时返回空

int fd = open(/dev/null,O_WRONLY)
dup2(fd,0)
dup2(fd,1)
dup2(fd,2)

如果传递图片等二进制文件,应把buffer 由string改为vector<char>,防止二进制数据中出现0导致string直接中断


http://www.ppmy.cn/ops/157790.html

相关文章

第四期书生大模型实战营-第4关-L2G4000

简述多模态大模型的工作原理 多模态大模型是一种能够同时理解和生成多种类型数据&#xff08;如文本、图像、音频、视频等&#xff09;的人工智能模型。其核心工作原理可概括为以下几个关键步骤&#xff1a; 1. 多模态数据编码 模态对齐&#xff1a;将不同形式的数据&#xf…

maven不能导入依赖和插件Cannot resolve plugin org.apache.maven.plugins:maven-xxx

新建了个工程&#xff0c;新设置了一个仓库地址&#xff0c;maven导入报错&#xff1a; 连最基础的maven自带的插件都无法导入&#xff1a; Cannot resolve plugin org.apache.maven.plugins:maven-install-plugin:2.4Try to run Maven import with -U flag (force update sna…

Python 面向对象(类,对象,方法,属性,魔术方法)

前言&#xff1a;在讲面向对象之前&#xff0c;我们先将面向过程和面向对象进行一个简单的分析比较&#xff0c;这样我们可以更好的理解与区分&#xff0c;然后我们在详细的讲解面向对象的优势。 面向过程&#xff08;Procedure-Oriented Programming&#xff0c;POP&#xff0…

01docker run

docker run 用于从镜像创建并启动容器。下面是一些常用的选项&#xff1a; -d: 让容器在后台运行&#xff0c;即以守护进程模式运行。--name: 给容器指定一个名称&#xff0c;便于识别和管理。-p: 将宿主机的端口映射到容器内的端口&#xff0c;实现网络通信。-e: 设置环境变量…

uni-app vue3 使用笔记

1.弹窗、加载、请求接口 <template><view><view class"tn-type-primary_bg" v-if"item.roleId16" click"confirmMarker(item.uid)">指定营销员</view></view></template><script setup lang"ts&qu…

CSS 实现下拉菜单效果实例解析

1. 引言 在 Web 开发过程中&#xff0c;下拉菜单是一种常见且十分实用的交互组件。很多前端教程都提供过简单的下拉菜单示例&#xff0c;本文将以一个简洁的实例为出发点&#xff0c;从 HTML 结构、CSS 样式以及整体交互逻辑三个层面进行详细解析&#xff0c;帮助大家理解纯 C…

linux基于 openEuler 构建 LVS-DR 群集--一、用命令行完成 二、使用脚本完成

目录 一、用命令行完成 1、在nginx上&#xff08;两台都是一样的配置&#xff09; 2、 在LVS上 1.&#xff09;绑定VIP &#xff08;与nginx上一致&#xff09; 2&#xff09;安装ipvsadm 3&#xff09;配置LVS-DR 3、在CLINT上 1&#xff09;验证 (验证成功如下) ​…

用Kibana实现Elasticsearch索引的增删改查:实战指南

在大数据时代&#xff0c;Elasticsearch&#xff08;简称 ES&#xff09;和 Kibana 作为强大的数据搜索与可视化工具&#xff0c;受到了众多开发者的青睐。Kibana 提供了一个直观的界面&#xff0c;可以方便地对 Elasticsearch 中的数据进行操作。本文将详细介绍如何使用 Kiban…