【Linux网络编程】日志与守护进程

2023-09-16 14:47:11

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

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);

    // 让子进程去setsid
    if (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 background

SYNOPSIS
       #include <unistd.h>

       int daemon(int nochdir, int noclose);

当nochdir为0时,daemon将更改进程的工作路径为根目录。
当noclose为0时,daemon将进城的STDIN, STDOUT, STDERR都重定向到/dev/null。一般情况下,这个参数都是设为0的。
 

更多推荐

百度 RT-DETR : 在实时目标检测上击败所有 YOLO !

论文地址:https://arxiv.org/abs/2304.08069代码地址:https://github.com/PaddlePaddle/PaddleDetection最近,基于端到端的Transformer检测器(DETRs)取得了显著的性能。然而,DETRs的高计算成本问题尚未得到有效解决,这限制了它们的

【计算机网络】图解应用层协议

图解应用层协议1.应用层2.远程登录2.1Telnet2.2SSH3.文件传输3.1FTP3.2TFTP4.电子邮件4.1通信架构4.2邮件地址4.3SMTP协议4.4POP3协议4.5IMAP协议5.WWW5.1URI5.2HTML5.3HTTP6.网络管理应用6.1DHCP协议6.2DNS协议1.应用层我们前面介绍

软件设计模式系列之七——原型模式

1模式的定义原型模式(PrototypePattern)是一种创建型设计模式,其主要目的是通过复制现有对象来创建新对象,而不是使用构造函数。原型模式将对象的创建委托给原型对象,通过克隆(复制)来生成新对象,这种方式可以避免对象的重复初始化,提高性能,并使对象的创建更加灵活和动态。原型模式的关键思想是通过复制已有对象的属

【视觉SLAM入门】8. 回环检测,词袋模型,字典,感知,召回,机器学习

"见人细过掩匿盖覆”1.意义2.做法2.1词袋模型和字典2.1.2感知偏差和感知变异2.1.2词袋2.1.3字典2.2匹配(相似度)计算3.提升前言:前端提取数据,后端优化数据,但误差会累计,需要回环检测构建全局一致的地图;1.意义通俗的讲,机器人两次经过同一个场景,为了检测是同一个场景,这就是回环检测。它可以用来构建

金融时间序列预测方法合集:CNN、LSTM、随机森林、ARMA预测股票价格(适用于时序问题)、相似度计算、各类评判指标绘图(数学建模科研适用)

项目设计集合(人工智能方向):助力新人快速实战掌握技能、自主完成项目设计升级,提升自身的硬实力(不仅限NLP、知识图谱、计算机视觉等领域):汇总有意义的项目设计集合,助力新人快速实战掌握技能,助力用户更好利用CSDN平台,自主完成项目设计升级,提升自身的硬实力。专栏订阅:项目大全提升自身的硬实力[专栏详细介绍:项目设计

『吴秋霖赠书活动 | 第二期』《ChatGPT原理与实战》

文章目录1.写在前面2.Tansformer架构模型3.ChatGPT原理4.提示学习与大模型能力的涌现4.1提示学习4.2上下文学习4.3思维链5.行业参考与建议5.1拥抱变化5.2定位清晰5.3合规可控5.4经验沉淀千模大战正酣,吃透ChatGPT是制胜关键!声明:赠书活动是博主与出版社达成合作,只属于粉丝的专属福

【Azure】微软 Azure 基础解析(九)Azure 标识、身份管理、Azure AD 的功能与用途

本系列博文还在更新中,收录在专栏:「Azure探秘:构建云计算世界」专栏中。本系列文章列表如下:【Azure】微软Azure基础解析(三)云计算运营中的CapEx与OpEx,如何区分CapEx与OpEx【Azure】微软Azure基础解析(四)Azure核心结构组件之数据中心、区域与区域对、可用区和地理区域【Azure

可编程交易区块为DeFi机器人提供强大动力

对于选择基金投资的人来说,一个基本指导原则就是寻找那些管理费最低的基金。资本应该是在运转,而不是用于支付费用。同样,MystenLab的Capy交易机器人利用可编程交易区块(ProgrammableTransactionBlocks,PTBs)将资本集中用于交易,而不是gas费,并且能够执行复杂的输入策略。Mysten

从人工测绘到无人机航测:探索测绘技术的巨大变革

在测绘领域,随着科技的不断进步,测绘技术也在不断演进。人工测绘、传统航测以及如今的无人机航测,每一次进步都为我们提供了更加精确和高效的地图数据。本文将带你深入探索这些技术的演变及其应用。一、人工测绘的时代早期的地图制作依赖于人工测绘,测量员们耗费大量时间和精力进行地面观测和数据记录。虽然人工测绘的精度一直被认为是比较可

【深度学习】Pytorch 系列教程(十三):PyTorch数据结构:5、数据加载器(DataLoader)

目录一、前言二、实验环境三、PyTorch数据结构0、分类1、张量(Tensor)2、张量操作(TensorOperations)3、变量(Variable)4、数据集(Dataset)5、数据加载器(DataLoader)一、前言ChatGPT:PyTorch是一个开源的机器学习框架,广泛应用于深度学习领域。它提供了

什么是无人机全自动飞行系统?概念、构成、作用深度解析

无人机的工业化应用深入催生出新的痛点,无人机应用飞手培养难、成本高、技术参差不齐,以及应急响应和采集作业价值等没有得到充分释放,由此无人机自动飞行系统、无人机自动机场横空出世,因其无人化、自动化、无人机值守的应用特性,让工业无人机更紧密与行业结合并快速应用。从自动机场到全自动飞行系统在此前我们详细介绍过自动机场的定义和

热文推荐