Linux
未读进程信号 —— 信号的处理 Linux 进程信号【信号处理】 | CSDN 1. 捕捉/处理信号(进程地址空间) 1. 内核空间与用户空间 每一个进程都有自己的进程地址空间,该进程地址空间由内核空间和用户空间组成: 用户所写的代码和数据位于用户空间,通过用户级页表与物理内存之间建立映射关系。 内核空间存储的实际上是操作系统代码和数据,通过内核级页表与物理内存之间建立映射关系。 内核级页表是一个全局的页表,它用来维护操作系统的代码与进程之间的关系。因此,在每个进程的进程地址空间中,用户空间是属于当前进程的,每个进程看到的代码和数据是完全不同的,但内核空间所存放的都是操作系统的代码和数据,所有进程看到的都是一样的内容。 操作系统本质上就是一个“基于时钟中断的死循环” ,它通过中断机制不断调度任务,实现多任务并发的“假象”。 OS 本身并没有“结束”的时候,它一直在“看有没有事要做”。 它开机后就进入一个大循环:看有没有进程要运行(调度)、看有没有中断发生、处理完后继续循环,这个循环不会退出,除非关机。 时钟中断就像是操作系统的心跳,每隔一段时间就“敲一下操作系统”:“该换人干 ...
Linux
未读进程信号 —— 信号的保存 1. 信号的其他相关概念 概念 含义 例子 信号产生(Generate) 内核决定给进程发送一个信号 比如你按了 Ctrl+C,系统决定给你的程序发一个 SIGINT 信号,就像同事敲了你的门说“有事” 信号未决(Pending) 信号已经产生,但还没被处理,只能排队等着 你正在开会,同事敲了门,但你没理他,他的请求被记下来了,等你有空再处理 信号阻塞(Blocked) 你设置了“我暂时不想处理这些信号” 你提前设置了“开会期间不接电话”,这些信号来了也只能排队等待,不会立刻打断你 信号递达(Delivery) 信号从 pending 状态变为被处理的状态 你开完会,系统发现有一个 SIGINT 在排队,于是开始处理它,触发你设置的处理函数 信号处理(Handler) 你决定怎么处理这个信号(默认、忽略、自定义函数) 你决定怎么处理这个信号:1. 默认处理(系统帮你处理)2. 忽略处理(假装没发生)3. 自定义函数(你写好逻辑来处理) 阻塞 ≠ 忽略 ≠ 未决: 阻塞 是控制递达的时机,信号仍然会记录下来(进入 pend ...
Linux
未读进程信号 —— 信号的产生 首先,本节的信号和上一节的信号量没有任何关系!它们的关系就像老婆饼和老婆,没有任何关系!后面的内容主要是根据 信号的产生 → 信号的保存 → 信号的处理 来进行讲解。 Linux 中的 31 个普通信号 1. 信号的概念 1. 生活中的信号 生活中常见的信号,比如: 闹钟:闹钟响 = 通知你该起床了。 红绿灯:红灯亮 = 告诉你该停下来了。 电话:响铃 = 通知你有人呼叫你,需要你接听。 警报器:火警 = 紧急中断,要求人立刻撤离。 可见,信号本质就是“通知 + 响应”,核心思想是:不需要你一直盯着,只要有事就异步提醒你。 2. 信号的定义与理解 信号是一种 异步通知机制。用来 通知进程 发生了某种 异步事件。本质:操作系统向一个进程发送一个整数编号(信号编号),告诉它“发生了某件事”,要求它“采取行动”或“做出响应”。 Q:你怎么认识这些信号? A:有人教我 → 我记住了。认识:① 识别信号 ② 知道信号的处理方法。即便现在没有信号产生,我们也知道信号产生后该干什么。那么我们是谁?站在 OS 层面,我们自然是进程啦~ 一个进程必须具备识别和 ...
System V 消息队列和信号量(了解) 【Linux】进程间通信 4——system V 消息队列,信号量 | CSDN System V IPC ---- 消息队列详解 | CSDN 博客 消息队列的视频 & 博文 | YouTobe System V 消息队列(编程接口指南) 信号量机制讲解 1. 消息队列的原理 System V 消息队列 是 UNIX/Linux 下的一种 进程间通信(IPC)机制,它允许不同进程以 消息(message)为单位交换数据,消息以 先进先出 的队列形式组织。异步通信:发送者发送后可以立即返回,接收者可随时读取。 System V 消息队列通过在内核中维护一个带有类型标记(mtype)的 FIFO 队列,实现了同一物理队列内多逻辑队列的分发能力,所有消息存在内核缓冲区,进程间通过 msgsnd/msgrcv 异步收发,OS 负责元数据管理与调度。 “如果只是一味地读数据,进程怎么知道哪些才是应该要读取的数据?” 这就是 mtype 的意义——把“一个大 FIFO”变成“多条逻辑子队列”。这也是 System V MQ 和单纯的管道( ...
进程间通信 —— System V 共享内存 传统的 System V IPC 主要包括三种:共享内存、消息队列、信号量,我们后面主要涉及其 System v 共享内存,消息队列和信号量仅作为了解。 现代开发和教学中,共享内存 作为重点和常用技术,而 消息队列 和 信号量 相对被弱化,主要有以下原因(了解,信息来自网络): 共享内存的独特优势(不可替代性): 极致性能(说白了就是快): 它是所有 IPC 方式中 速度最快 的。一旦建立映射,数据交换直接在内存中进行,没有内核到用户空间的数据拷贝开销。 灵活性: 共享内存本身只是提供了一块共享区域,进程可以在上面构建任何复杂的数据结构和通信协议。消息队列则限制了消息的结构和大小。 消息队列的局限性(逐渐被替代): 性能瓶颈: 每次发送和接收消息都涉及 系统调用 和 数据在内核与用户空间之间的拷贝。对于大量或高频小消息的开销非常明显。 灵活性限制: 消息有最大长度限制,且通常是 FIFO 的,虽然支持优先级,但模型相对固定。 注: 老方案,API 麻烦,扩展性差,写多进程服务时不如直接用 socket。一般直接 ...
日志 1. 为什么需要日志等级? 在实际生产中,程序输出的信息非常多,如果没有等级就会导致: 开发阶段找不到重点(调试信息太多)。 上线后也不好排查问题(没有区分严重错误和普通信息)。 因此,合理使用日志等级,能让我们: 快速定位错误。 过滤无用信息。 分环境(开发、测试、生产)灵活控制日志量。 2. Linux 常见日志等级 以 syslog 标准 为例(这是 Linux 内核和很多守护进程默认遵循的): 等级名 数值(优先级) 典型含义 EMERG 0 系统不可用,比如内核崩溃(panic) ALERT 1 必须立刻采取措施,比如磁盘坏块 CRIT 2 严重错误,可能导致程序崩溃 ERR (ERROR) 3 一般错误,需要修复 WARNING 4 警告信息,可能有潜在风险 NOTICE 5 正常但需要注意的事件 INFO 6 普通运行信息 DEBUG 7 调试信息,开发阶段最详细 数值越小,级别越高,越重要。 在生产环境中,一般只保留 WARNING 及以上等级,避免刷盘压力和磁盘占用。 然而在实际操作当中,我们大多只考 ...
Linux
未读进程间通信 —— 有名管道篇 1. 什么是有名管道 1. 基本定义 有名管道是 Linux 中的一种进程间通信方式,其本质也是一个特殊类型的文件,存在于文件系统中,支持 无亲缘关系的进程 之间的数据通信。 2. 与匿名管道的对比 特性 匿名管道(pipe) 有名管道(FIFO) 是否有文件路径 ❌ 没有 ✅ 有(存在于文件系统中) 是否只能父子进程通信 ✅ 是 ❌ 可以无亲缘关系通信 创建方式 pipe() mkfifo() / mknod() 常见用途 父子进程、线程内通信 shell 脚本、后台服务通信 2. 有名管道的创建与使用 1. mkfifo 函数原型 —— 创建有名管道 1234#include <sys/types.h>#include <sys/stat.h>int mkfifo(const char *pathname, mode_t mode); 参数详解 const char *pathname: 表示希望创建的 有名管道的路径(通常是绝对路径或当前目录下的文件名)。它创建出来的是一个 文件系统中的特殊设 ...
Linux
未读进程间通信 —— 匿名管道篇 1. 什么是管道 管道就是一个内核缓冲区,允许一个进程写数据,另一个进程从中读数据。 它像一根水管:一头写入,一头读取,中间是内核帮我们传递数据。 2. 管道的直接原理 1. 底层本质 管道就是操作系统在内核空间里开辟的一块 内存缓冲区,这个缓冲区由内核维护,进程不能直接访问,只能通过 文件描述符 进行读写。 管道使用了 环形缓冲区(循环队列结构),读写两端由内核控制。 当我们调用 pipe(fd),操作系统会: 在内核里创建一个缓冲区。 返回两个文件描述符: fd[0]:读端读进程:read(fd[0], buf, size); 从管道中读取数据(从内核缓冲区读)。 fd[1]:写端写进程:write(fd[1], data, size); 把数据写入管道(进入内核缓冲区)。 pipefd[0] → 0 → 嘴巴 → 读书 → 读端 pipefd[1] → 1 → 钢笔 → 写字 → 写端 3. 匿名管道的接口 1. pipe() 函数原型 在 Linux 中,pipe() 是用于创建 匿名管道 的系统调用,原型如下 ...
Linux
未读进程间通信前言 1. 进程间通信的介绍 1. 进程间通信的目的 进程通信的核心目的是在多个独立运行的进程之间传递数据、同步执行、共享资源。即实现多个进程在数据层面的交互。 实际应用需求: 数据共享: 多个进程处理同一批数据,共享同样的资源。 通知事件: 某一进程完成任务后通知其他进程(如进程终止时要通知父进程)。 某种协同: 控制对临界资源的访问,防止竞争。 服务请求与响应: 客户端请求服务器、子进程向父进程返回结果。 进程控制 :有些进程希望完全控制另一个进程的执行(如 Debug 进程),此时控制进程希望能够拦截另一个进程的所有陷入和异常,并能够及时知道它的状态改变。 [!NOTE] 每个进程本质上是一个 独立的虚拟地址空间(由 MMU/页表保护),天然是“互不相见”的。因为进程独立性的存在,导致进程通信的成本比较高,所以 通信是有成本的!想要通信,必须要构造一个 “公共的资源”(可访问区域)。这个“资源”谁来提供?—— 操作系统。 2. “公共资源”为什么不是由一个进程来提供? 如果由 某个进程创建并拥有 这个资源: 该资源的生命周期就依附于该进程。一旦这个进程结束,资 ...
VS Code 连接 Linux 服务器全流程解析 关于 VS Code 最基本的使用这里就不过多赘述了,因为我这里之前已经装好配置过 VS Code 了,下面开始介绍如何使用 VS Code 连接远端主机进行开发: 1. 使用 VS Code 连接远端主机 首先在 Windows 下打开我们的 VS Code,找到扩展,下载插件 Remote - SSH。 下载完成后,添加远端主机: 摁下键盘的 F1 键,输入 Remote-SSH: Open SSH Host 的字样,在下方找到添加新的主机。 进行登录:基本格式是 ssh root@……(ssh + 空格 + root@ + 自己的公网 IP),就是当初在 Xshell 中进行登录一样。 本地记录: VS Code 会提示将在本地将远端的用户名和密码记录下来。 如何找到这个所谓的 config 文件? 我们的刚刚进行的本地记录文件(config)可以从 C 盘 的用户目录下的 .ssh\config 中找到,用记事本打开该文件,就是本地对远端主机的配置信息。 连接远端主机: 选中左边窗口栏的 远程资源管 ...











