【Linux网络编程】日志与守护进程
日志是网络服务器程序在后台以守护进程的形式运行时,处理情况的描述被打印到了日志文件里面,方便维护人员查看。
1.前台进程与后台进程

左边会话输入命令 sleep 10000 & 代表进程后台运行,右边会话输入命令 sleep 20000可以看到命令行解释器直接卡住了。

STAT S+就是前台进程的意思,STAT S就是后台进程。可以看到后台运行的进程并不影响命令行解释器bash进程的运行,而前台进程sleep 20000运行的时候,bash进程无法运行了。所以能得出结论,一个会话中只能有一个前台进程。
2. 会话与终端

PPID:父进程ID
PID:进程ID
PGID:进程组ID
SID:会话
TTY:终端
会话是一个进程组(任务)的集合。在xshell模拟的Linux终端上,一个会话在被打开的时候就会启动一个bash进程,bash进程是用于对用户输入的命令进行分析解释并返回结果到该会话的终端文件TTY中的。那么bash进程自然就是该会话的第一个进程。可以看到上图红色标记,COMMAND-sleep 10000与COMMAND - -bash的SID都是2917,而bash的PID和PGID也都是2917。这是什么意思呢?一个会话中第一个进程的PID就会作为SID,同理一个进程组中第一个进程PID就是进程组的PGID,一个进程组至少有一个进程。

可以看到我们把hello world重定向到了/dev/pts/4这个文件下,结果在右边的会话中显示出来了。这是为什么呢?在/dev/pts/路径下存在着各个会话的终端文件,在A会话中输入命令,bash进程对命令进行解释后返回的结果就默认输出到A会话的终端文件。
3.前台任务与后台任务切换
jobs 查看当前会话进程组
可以看到每个进程组(任务)前面都有[1] [2]这样的任务编号。
fg 后台任务切换成前台任务

ctrl+z 暂停前台任务
bg 在后台运行任务

4.为什么要创建守护进程?
创建一个会话就会可以创建新的前后台任务,那么销毁会话可能就会影响会话内的所有任务。所以一般网络服务器为了不受到用户的登录注销的影响都是以守护进程的方式运行。
守护进程就是为了让任务不受所在会话的注销的影响,为该进程可以创建一个新的会话。
#include <unistd.h>pid_t setsid(void);
setsid() 创建一个新会话,如果调用进程不是进程组组长。调用进程是新会话的领导者,也是新进程组的组长,并且没有控制终端。 这调用进程的进程组 PGID 和会话 SID 被设置为 调用进程的PID。
进程pcb里面是会包含当前进程的工作路径的,这也就是我们在open一个文件的时候,如果没有就创建,文件就会在当前路径下的原因。

/dev/null是一个“黑洞”文件,不能从中读取任何数据也不能向其写入任何数据。
5.如何创建守护进程?
1. 使用setsid()创建一个新的会话
2. setsid(), 调用进程,不能是组长!我们怎么保证自己不是组长呢?创建子进程。
3. 必要操作:a. 忽略异常信号 b. 0,1,2文件描述符要做特殊处理 c. 进程的工作路径可能需要更改
setsid函数:
代码:
#pragma once#include <signal.h>
#include <unistd.h>
#include <cstdlib>#include "log.hpp"
#include "err.hpp"
#include <cerrno>
#include <cstring>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>void Daemon()
{// 忽略信号signal(SIGCHLD, SIG_IGN);signal(SIGPIPE, SIG_IGN);// 让子进程去setsidif (fork() > 0)exit(0);// 为当前进程组(任务)创建新的会话;pid_t ret = setsid();if ((int)ret == -1){logMessage(Fatal, "setsid error,code:%d ,string: %s\n", errno, strerror(errno));exit(SETSID_ERR);}// 更改工作路径到根目录// chdir("/");//0,1,2做特殊处理int fd = open("/dev/null",O_RDWR);//可读可写方式打开黑洞文件if(fd<0){logMessage(Fatal, "open error,code:%d ,string: %s\n", errno, strerror(errno));exit(OPEN_ERR);}dup2(fd,0);dup2(fd,1);dup2(fd,2);close(fd);}
由于进程组组长长不能单起一个会话的原则,所以创建子进程作为守护进程,守护进程是一个孤儿进程。
其实也可以直接用Unix标准库函数daemon函数创建守护进程:

NAME
daemon - run in the backgroundSYNOPSIS
#include <unistd.h>int daemon(int nochdir, int noclose);
当nochdir为0时,daemon将更改进程的工作路径为根目录。
当noclose为0时,daemon将进城的STDIN, STDOUT, STDERR都重定向到/dev/null。一般情况下,这个参数都是设为0的。
相关文章:
【Linux网络编程】日志与守护进程
日志是网络服务器程序在后台以守护进程的形式运行时,处理情况的描述被打印到了日志文件里面,方便维护人员查看。 1.前台进程与后台进程 左边会话输入命令 sleep 10000 & 代表进程后台运行,右边会话输入命令 sleep 20000可以看到命令行解…...
多输入多输出 | MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出
多输入多输出 | MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出 目录 多输入多输出 | MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出预测效果基本介绍程序设计往期精彩参考资料 预测效果 基本介绍 MATLAB实现CNN-BiGRU卷积双向门控循环单元多输入多输出…...
Qt: 鼠标形状设置
设置全局鼠标形状 设置完毕后,整个APP的任何窗体,包括Dialog中的鼠标形状都会被修改为设定类型,某一个控件设定的鼠标形状将被替换。一般不建议使用 QCursor cursor;//创建鼠标对象 cursor.setShape(Qt::CursorShape::ClosedHandCursor);//…...
【Oracle】Oracle系列之七--表的创建与管理
文章目录 往期回顾前言1. 表的创建2. 表的修改3. 表中数据的增删改查(1)插入数据(2)删除数据(3)更新数据 4. 表的Merge5. 表的删除6. 表的重命名7. 表的索引(1)B树索引(2…...
C/C++运算符超详细讲解(系统性学习day5)
目录 前言 一、运算符的概念与分类 二、算术运算符 三、关系运算符 四、逻辑运算符 五、赋值运算符 六、运算符的优先级 总结 前言 本篇文章是对运算符的具体讲解。 一、运算符的概念与分类 概念: 运算符就是一种告诉编译器执行特定的数学或逻辑操作的符…...
Android 遍历界面所有的View
关于作者:CSDN内容合伙人、技术专家, 从零开始做日活千万级APP。 专注于分享各领域原创系列文章 ,擅长java后端、移动开发、商业变现、人工智能等,希望大家多多支持。 目录 一、导读二、概览三、实践四、 推荐阅读 一、导读 我们…...
建筑能源管理(1)——建筑能源管理的概念
1、什么是建筑能源管理 目前,主要有三种不同的类型能源管理: (1)节约型能源管理 又称“减少能耗型”能源管理。这种管理方式着眼于能耗数量上的减少,采取限制用能的措施。例如,在非人流高峰时段停开部分电梯、在室外气温特别高时…...
SpringSecurity
明文存储密码,前加{noop}...
C++ vector模拟实现
目录 一.默认成员函数 二.扩容相关函数 三.[]重载 四.修改函数 五.迭代器 继上次写完string之后,可以写一个vector练练手以及熟悉其底层。vector是一个顺序表,相比普通数组不同点在于顺序表的数据必须是连续存放的。 一.默认成员函数 string是只存放字符…...
BUUCTF:[GYCTF2020]FlaskApp
Flask的网站,这里的功能是Base64编码解码,并输出 并且是存在SSTI的 /hint 提示PIN码 既然提示PIN,那应该是开启了Debug模式的,解密栏那里随便输入点什么报错看看,直接报错了,并且该Flask开启了Debug模式&am…...
好玩的调度技术
好玩的调度技术 文章目录 好玩的调度技术前言一、乱金柝-空间剥离二、拖拽编辑三、全端兼容 前言 最近感觉自己抑郁了,生态技术实在太庞大太复杂,所以我决定先停一段时间,在停下写生态的这两天写了几个调度的小玩意换换脑子,很有…...
Android 自定义加解密播放音视频(m3u8独立加密)
文章目录 背景加密流程音视频解密音视频播放结语 背景 当涉及App内部视频的时候,我们不希望被别人以抓包的形式来爬取我们的视频大视频文件以文件方式整个加密的话需要完全下载后才能进行解密当前m3u8格式虽然支持加密,但是ts格式的小视频可以独立播放的…...
常见的文件格式
一、C:\fakepath\新建文本文档.txt [object String] 实现方式: <input onchange"test(this.value)" type"file"></input><script>function test(e){console.log(e,Object.prototype.toString.call(e))}</script> 二、…...
浏览器输入url后回车展开过程
当你在浏览器中输入一个URL并敲下回车后,浏览器会执行一系列步骤来访问并展示网页。下面是浏览器访问网页的一般流程: DNS解析:浏览器首先会提取URL中的主机名,然后向DNS服务器发送请求,将主机名解析为对应的IP地址。这…...
Docker 容器创建命令说明
使用命令如下: docker run -itd --name=cluster -v /home/ClusterApp/cluster:/home/ClusterApp/cluster --restart=always --privileged=true -p 12000:12000 python:3.8 命令说明: docker run 创建一个容器并运行 docker run --help 可以查看所有的参数: 命令中参数说明 -…...
西瓜书读书笔记整理(六)—— 第六章 支持向量机
第六章 支持向量机 6.1 间隔与支持向量6.1.1 什么是支持向量机6.1.2 支持向量与间隔6.1.3 支持向量机的求解过程 6.2 对偶问题(dual problem)6.2.1 什么是对偶问题6.2.2 如何求解支持向量机的对偶问题 6.3 核函数(kernel function)…...
蓝桥杯每日一题2023.9.23
4961. 整数删除 - AcWing题库 题目描述 分析 注:如果要进行大量的删除操作可以使用链表 动态求最小值使用堆,每次从堆中取出最小值的下标然后在链表中删除 注意long long 代码解释: while(k --){auto t q.top();q.pop();res t.first;i…...
C语言数组和指针笔试题(三)(一定要看)
目录 字符数组四例题1例题2例题3例题4例题5例题6例题7 结果字符数组五例题1例题2例题3例题4例题5例题6例题7结果字符数组六例题1例题2例题3例题4例题5例题6例题7 结果 感谢各位大佬对我的支持,如果我的文章对你有用,欢迎点击以下链接 🐒🐒🐒个…...
leetcode11 盛水最多的容器
题目 给定一个长度为 n 的整数数组 height 。有 n 条垂线,第 i 条线的两个端点是 (i, 0) 和 (i, height[i]) 找出其中的两条线,使得它们与 x 轴共同构成的容器可以容纳最多的水。 返回容器可以储存的最大水量。 示例 输入:[1,8,6,2,5,4,8,…...
进入数据结构的世界
数据结构和算法的概述 一、什么是数据结构二、什么是算法三、如何去学习数据结构和算法四、算法的时间复杂度和空间复杂度4.1 算法效率4.2 大O的渐进表示法4.3 时间复杂度4.4 空间复杂度4.5 常见复杂度对比 一、什么是数据结构 数据结构是计算机存储、组织数据的方式。&#x…...
基于Altera Cyclone4 FPGA-EP4CE15F17C8核心板的硬件设计实战(原理图+PCB+AD09工程)
1. 从零开始搭建FPGA核心板硬件系统 第一次接触FPGA核心板设计时,我被密密麻麻的引脚和复杂的电源系统搞得头晕眼花。直到用AD09完整走完EP4CE15F17C8核心板的设计流程,才发现硬件开发就像搭积木——只要掌握模块化思维,菜鸟也能做出专业级设…...
告别蜗牛速度!优麒麟20.04 LTS换源华为云镜像保姆级教程
优麒麟20.04 LTS提速指南:华为云镜像配置全解析 每次在优麒麟上安装软件时,看着进度条像蜗牛一样缓慢前进,是不是让你感到无比焦虑?特别是当你急需某个工具完成工作时,漫长的等待简直让人抓狂。作为一款基于Ubuntu的国…...
从LLaVA到Stable Diffusion:多模态融合选拼接还是交叉注意力?一张图帮你做技术选型
多模态融合技术选型指南:拼接与交叉注意力的深度对比与实践策略 在构建现代多模态AI系统时,工程师们常常面临一个关键决策点:如何有效地融合来自不同模态的信息?想象一下,你正在开发一个智能医疗影像分析系统ÿ…...
3个步骤掌握阿里云盘命令行客户端的快传链接:大文件分享的终极解决方案
3个步骤掌握阿里云盘命令行客户端的快传链接:大文件分享的终极解决方案 【免费下载链接】aliyunpan 阿里云盘命令行客户端,支持JavaScript插件,支持同步备份功能。 项目地址: https://gitcode.com/GitHub_Trending/ali/aliyunpan 在当…...
百考通:AI赋能设计都高效落地
在数字化时代,市场调研、产品设计、学术研究等场景中,问卷设计作为核心环节,直接影响着数据收集的质量与工作推进的效率。传统问卷设计往往面临流程繁琐、耗时耗力、问题设计不精准等痛点,而百考通(https://www.baikao…...
多项式朴素贝叶斯
多项式朴素贝叶斯(二分类) 题意 实现一个 Multinomial Naive Bayes 二分类器。 train:二维列表,每行最后一列为标签 y \in \{0,1\},其余列为非负整数词频test:二维列表,仅包含词频特征ÿ…...
【仿真】Carla跨平台部署指南:从零到一,附ROS2与Autoware.auto连接实战
1. Carla仿真平台概述 Carla是一款开源的自动驾驶仿真平台,基于虚幻引擎构建,能够提供高度逼真的城市环境和交通场景。我第一次接触Carla是在2018年,当时它还处于早期开发阶段,但已经展现出惊人的潜力。经过多年发展,现…...
Unity URDF导入终极指南:3步快速实现机器人仿真
Unity URDF导入终极指南:3步快速实现机器人仿真 【免费下载链接】URDF-Importer URDF importer 项目地址: https://gitcode.com/gh_mirrors/ur/URDF-Importer Unity URDF Importer是Unity Robotics官方推出的机器人模型导入工具,它能够让你在Unit…...
VS Code终端切换全攻略:从PowerShell到CMD的保姆级教程(含常见问题解决)
VS Code终端切换全攻略:从PowerShell到CMD的保姆级教程(含常见问题解决) 在开发者的日常工作中,终端是不可或缺的工具。VS Code作为最受欢迎的代码编辑器之一,其内置终端功能强大且高度可定制。然而,许多开…...
系统焕新:Win11Debloat工具让Windows性能提升51%的全方位优化方案
系统焕新:Win11Debloat工具让Windows性能提升51%的全方位优化方案 【免费下载链接】Win11Debloat 一个简单的PowerShell脚本,用于从Windows中移除预装的无用软件,禁用遥测,从Windows搜索中移除Bing,以及执行各种其他更…...
