当前位置: 首页 > article >正文

【Linux网络编程】:守护进程,前台进程,后台进程

🎁个人主页:我们的五年https://blog.csdn.net/djdjiejsn?spm=1011.2444.3001.5343

🔍系列专栏:Linux网络编程课程学习 https://blog.csdn.net/djdjiejsn/category_12885098.html

🌷追光的人,终会万丈光芒

🎉欢迎大家点赞👍评论📝收藏⭐文章

Linux网络编程笔记:

https://mp.csdn.net/mp_blog/manage/column/allColumnList

前言:

大家新年快乐!这篇文章是网络编程的第一篇文件,是对网络UDP,TCP,序列化反序列化的一些总结,应用层协议。

目录

1.守护进程

1.1前台进程??后台进程??守护进程??

1.2特点:

1.3前台进程,后台进程,守护进程的区别:

1.4细节解释:

2.概念解释:

3.理解守护进程:

 4.如何让进程变成守护进程:

问题1:

问题2:

问题3:


1.守护进程

1.1前台进程??后台进程??守护进程??

如果我们在Xshell上启动一个服务器程序,正常情况下是前台进程,加上&会变成后台进程。但是当我们关闭Xshell终端的时候,前台进程会关闭,后台进程会受影响。而且服务器是要长期运行,不能关闭的。

1.2特点:

无控制终端:脱离控制终端,避免收到终端的干扰,它是和客户端进行交流的。和Xshell终端摆脱了联系。

不占用前端资源:Xshell只允许一个前台进程存在,守护进程不占用前台资源,能正常bash执行其他指令。

1.3前台进程,后台进程,守护进程的区别:

特性前台进程后台进程守护进程
终端依赖必须绑定终端(TTY)可脱离终端(但属于当前会话session)完全脱离终端和会话session
用户交互支持终端输入输出无输入,输出可重定向无输入输出(LOG日志记录)
生命周期终端关闭则关闭会话终止则终止系统关闭则关闭

1.4细节解释:

1.一个终端只能有一个前台进程,0个或者多个后台进程。

2.当有前台进程时,bash进程会被换到后台。此时输入的命令是给此时在运行的前台进程。当前运行的前台进程不接收处理输入的命令,所以不能执行命令。


2.概念解释:

PPID:父进程。

PID:当前进程ID。

PGID:进程组ID。

SIG:与哪个会话相连(Session)。

TTY:与哪个终端相连。

TPGID:控制终端的前台进程组ID。是哪个终端打开的。

STAT:表示状态,+表示前台进程。


3.理解守护进程:

我们用xshell登录进行连接,就是创建了一个会话Session。前台进程和后台进程本质还是属于同一个session,断开连接的时候,前台进程会退出,后台进程会受影响,可能是报错。

守护进程是脱离当前会话Session,形成了一个独立的Session。

1.守护进程脱离终端,是网络进行IO。

2.守护进程是孤儿进程。


 4.如何让进程变成守护进程:

#include <unistd.h>

int daemon(int nochdir, int noclose);

自动变成守护进程。

参数解释:

nochdir:

若为 0,进程的工作目录会改为根目录 /;

若为 1,保持当前工作目录。

noclose:

若为 0,将标准输入、输出、错误(stdin/stdout/stderr)重定向到 /dev/null;(黑洞级文件)

若为 1,保留原有文件描述符。

#include <unistd.h> pid_t setsid(void);

手动转化为守护进程

调用成功以后,就形成一个新的会话,如果调用进程原本关联了一个控制终端(如Shell终端),调用 setsid 后,它将与该终端完全分离。

问题1:

进程组的组长不能变成守护进程

创建子进程,父进程退出,子进程向后运行,子进程就不是进程组组长了。

问题2:

因为守护进程没有与终端关联,没有输入,输出。所以要把标准输入,标准输出,标准错误全部重定向。

/dev/null是黑洞文件。

int fd = ::open(devnull, O_WRONLY);
if (fd > 0)
{
     // 各种重定向
     dup2(fd, 0);
     dup2(fd, 1);
     dup2(fd, 2);
     close(fd);
}

如果是不需要重定向,直接关闭就可以了。

::close(0);
::close(1);
::close(2);

问题3:

守护进程要对一些退出信号进行忽略:

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

SIG_ING:忽略信号。


http://www.kler.cn/a/531267.html

相关文章:

  • 电控三周速成计划参考
  • C#常用744单词
  • 剑指offer 链表 持续更新中...
  • 在 Ubuntu 中使用 Conda 创建和管理虚拟环境
  • springboot 启动原理
  • Unity Shader Graph 2D - 角色身体电流覆盖效果
  • C++哈希表深度解析:从原理到实现,全面掌握高效键值对存储
  • Mac M1 Comfyui 使用MMAudio遇到的问题解决?
  • 【C++】B2122 单词翻转
  • 【C++篇】位图与布隆过滤器
  • 毫秒级响应的VoIP中的系统组合推荐
  • 【DeepSeek背后的技术】系列一:混合专家模型(MoE)
  • 从零开始实现一个双向循环链表:C语言实战
  • Java多线程——对象的组合
  • FPGA|例化生成的PLL功能IP核
  • 为什么在Rust中要用Struct和Enum组织数据?
  • MySQL锁类型(详解)
  • React+Cesium基础教程(003):加载3D建筑物和创建标签
  • 利用deepseek参与软件测试 基本架构如何 又该在什么环节接入deepseek
  • Pathformer3D: A 3D Scanpath Transformer for 360° Images(浅看)
  • Simula语言的物联网
  • pycharm 中的 Mark Directory As 的作用是什么?
  • C++11新特性之constexpr
  • Machine Learning Engineering Open Book 机器学习工程开放书
  • 八、Spring Boot 日志详解
  • 带负权值的图如何计算最短路径?