自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+

C/C++

阅读|思考|产出|进步

  • 博客(668)
  • 资源 (1)
  • 收藏
  • 关注

原创 守护进程_第十三章_《UNIX环境高级编程(第三版)》_笔记

以上8步(含日志初始化)构成创建守护进程的标准函数,调用后即可将普通进程转为守护进程。核心逻辑是「脱离终端→独立会话→释放资源→保证权限」,每一步都不可省略,否则会导致守护进程不稳定。7步标准创建流程(两次fork+setsid+资源清理)是基础;syslog日志机制是守护进程输出信息的唯一合法方式;信号处理需保证“可重入”,重点处理SIGTERM(退出)和SIGHUP(重载);避免多实例、意外获得终端、资源泄露是关键避坑点。

2025-12-30 08:24:20 720

原创 第十二章_高级I/O_《UNIX环境高级编程(第三版)》_笔记

存储映射I/O(mmap):零拷贝高效I/O,适合大文件读写和进程间共享内存,核心是。I/O多路复用:select(跨平台、低并发)、poll(无fd上限)、epoll(Linux高并发首选),核心是“监听多fd就绪事件”。记录锁:通过fcntl实现文件/记录级锁,解决多进程冲突,共享锁与排他锁互斥。异步I/O(AIO):非阻塞发起I/O,通过信号或回调通知完成,适合多I/O任务并行。信号驱动I/O:SIGIO通知I/O就绪,信号处理函数中完成I/O,适用于低速设备和socket。

2025-12-29 08:18:02 550

原创 第十一章_终端I/O_《UNIX环境高级编程(第三版)》_笔记

终端:进程的交互式输入输出设备(物理终端如/dev/tty、伪终端如/dev/pts/0)。终端I/O的两种核心模式:规范模式(Canonical Mode):行缓冲,进程仅在收到换行符(\n)或EOF时才读取数据,支持退格、删除等特殊字符处理(默认模式)。非规范模式(Non-Canonical Mode):无缓冲,输入数据立即被进程读取,不处理特殊字符(适用于密码输入、实时响应场景)。终端I/O的核心是termios结构,所有属性配置都围绕该结构的标志位和特殊字符数组。

2025-12-29 08:17:46 910

原创 第十章_信号_《UNIX环境高级编程(第三版)》_笔记

信号是内核向进程发送的异步通知,告知进程发生特定事件(如终端中断、内存越界),进程需中断当前执行流响应。信号是异步通知,处理函数必须“简短、异步安全”,避免复杂操作。优先用sigaction替代signal,它支持信号屏蔽、附加信息、系统调用重启,兼容性更好。信号集与是控制信号递达的核心,用于保护临界区、避免信号嵌套。不可靠信号(1~31)可能丢失,可靠信号(34+)支持排队,高频场景选可靠信号。定时器与信号联动是实战常用场景,setitimer比alarm更强大,优先使用。

2025-12-28 19:40:26 536

原创 第九章_进程间的关系_《UNIX环境高级编程(第三版)》_笔记

进程组是进程的基本管理单位,通过管理,组长进程PID=PGID。会话由进程组组成,setsid创建新会话(需非组长进程),会话首进程可关联控制终端。控制终端仅与一个会话关联,前台进程组唯一能接收终端信号,通过切换。孤儿进程组由父进程退出产生,前台孤儿进程组会收到SIGHUP,需手动处理以避免终止。作业控制是三层模型的实际应用,shell通过进程组管理前后台作业,依赖信号处理实现状态切换。

2025-12-28 19:27:28 573

原创 第八章_进程控制_《UNIX环境高级编程(第三版)》_笔记

fork的核心是“写时复制”,需区分父子进程的共享与独立资源,避免缓冲重复输出问题。exec函数族的选择:需路径搜索用execlpexecvp,自定义环境变量用execleexecvpe,底层调用用execve。进程等待优先用waitpid(灵活控制等待对象和方式),必须解析子进程终止状态,避免僵尸进程。进程终止:正常终止用exit(确保缓冲冲洗和退出处理),子进程终止用_exit(避免干扰父进程)。进程组是作业控制的基础,setpgid可创建新进程组,为后续前台/后台作业管理打基础。

2025-12-28 19:17:39 770

原创 第七章_进程环境_《UNIX环境高级编程(第三版)》_笔记

进程终止优先使用exit(确保缓冲冲洗和退出处理),子进程终止用_exit(避免干扰父进程)。环境变量修改需区分putenv(慎用,需注意内存)和setenv(推荐,安全),修改仅当前进程有效。存储空间布局决定了变量的生命周期和访问权限,避免返回栈上变量的地址。命令行参数解析需处理选项和普通参数,利用简化遍历。资源限制的软限制可动态调整,硬限制为上限,高并发程序需关注。

2025-12-28 19:12:18 853

原创 第六章_系统数据文件与信息_《UNIX环境高级编程(第三版)》_笔记

UNIX系统中,类似口令文件、组文件的系统数据文件(如/etc/hostsget函数:读取下一条记录(自动打开文件),返回指向静态结构的指针(需手动复制数据)。set函数:反绕文件(重新从开头读取)。end函数:关闭文件(必须调用,避免资源泄露)。键搜索函数:针对核心字段的快速查询(如通过主机名查/etc/hosts系统数据文件遵循“get/set/end”通用模式,访问时需注意静态变量覆盖和文件关闭。安全优先:口令/阴影文件的敏感信息需严格控制访问权限,避免泄露。

2025-12-28 19:08:08 963

原创 第五章_标准I/O库_《UNIX环境高级编程(第三版)》_笔记

缓冲机制是核心:优先使用系统默认缓冲,需手动控制时用setvbuf,关键节点(如进程退出前、跨流读数据前)调用fflush。函数选择原则:单字符/行I/O用fgetcfputs(安全),格式化I/O用snprintf(避免溢出),临时文件用mkstemp(安全),内存数据操作用(高效)。避坑要点:不使用getstmpnam;fgets缓冲区预留\0空间;getc参数无副作用;流定向不可混用。

2025-12-28 18:58:57 689

原创 第四章_文件与目录_《UNIX环境高级编程(第三版)》_笔记

用statlstat获取文件属性,S_ISxxx宏判断文件类型。umask控制默认权限,chmod修改权限,特殊位(setuid/setgid)实现特权切换。链接选择:硬链接适合同一文件系统的别名,符号链接适合跨系统或目录快捷方式。目录操作:遵循“打开→读取→关闭”流程,递归遍历时需过滤..并构建完整路径。时间戳:区分“访问/修改/状态更改”,用utimesfutimens修改时间。文件属性获取:优先用lstat(避免符号链接干扰),S_ISxxx宏判断文件类型。umask。

2025-12-28 18:48:08 914

原创 第三章_文件I/O_《UNIX环境高级编程(第三版)》_笔记

原子操作:多步操作一次性完成,中间不可中断,避免其他进程干扰——UNIX文件I/O中解决并发冲突的核心手段。用核心I/O函数(open/read/write/lseek/close)完成基础操作,注意返回值判断和循环读写。优化效率:缓冲区大小设为磁盘块大小(4096),避免频繁系统调用。并发安全:用原子操作(O_APPEND/pread/pwrite/O_CREAT+O_EXCL)避免冲突。灵活控制:用dup/dup2重定向fd,用fcntl修改标志,用fsync保证数据安全。

2025-12-28 18:39:28 573

原创 第二章_UNIX标准及实现_《UNIX环境高级编程(第三版)》_笔记

ISO C是“通用C语言标准”,POSIX是“UNIX系统接口标准”,SUS是“UNIX系统认证标准”。printf(ISO C)、read(POSIX)、shmat(XSI扩展,SUS特有)。#include <limits.h> // 编译时限制头文件printf("int最大值: %d\n", INT_MAX);// ISO C定义(32位系统通常为2147483647)printf("long最大值: %ld\n", LONG_MAX);

2025-12-28 18:32:20 692

原创 第一章_UINX基础知识_《UNIX 环境高级编程(第三版)》_笔记

apue.h:书中自定义头文件,封装了<unistd.h>(系统调用头文件)、<stdio.h>等标准头文件,还定义了err_sys等错误处理函数(避免重复写perror:关键优化点!多数UNIX文件系统的磁盘块大小是4096字节,设置缓冲区为该值可减少readwrite的调用次数(系统调用需切换用户态→内核态,成本高)。若设为1字节,会触发百万次系统调用,效率极低。核心难点:理解“无缓冲I/O”的本质——每次readwrite都直接调用内核,缓冲区由用户手动管理。

2025-12-28 18:12:02 832

原创 内存泄漏-munmap操作问题

解决munmap地址不变munmap的addr必须是mmap返回的原始起始地址(或映射区内的页对齐子地址);长度对齐munmap的length必须与mmap的页对齐长度一致(或页对齐的子长度);校验返回值:必须检查mmapmunmap的返回值,及时处理错误;避免越界:禁止跨映射区解除,禁止重复解除。

2025-12-18 10:41:25 658

原创 怎么保证brk的内存完全释放?

要最大程度地保证brk内存的释放,关键在于减少内存碎片和主动引导glibc进行清理。对于新项目或特定场景,使用更现代的内存分配器(如jemalloc)往往是更根本的解决方案。希望这些具体的方案能帮助你解决这个棘手的问题!如果你能分享更多关于你的应用场景(例如,是长期运行的服务,还是短生命周期的工具),或许我可以提供更针对性的建议。

2025-12-18 10:30:36 237

原创 大内存通过mmap分配,释放后什么情况不能通过munmap直接归还OS

虽然mmap分配的大内存通常能被munmap直接归还,但在系统VMA数量耗尽、munmap参数错误或glibc分配策略改变等情况下,可能无法顺利归还。规范编程、理解系统限制和库行为是避免问题的关键。

2025-12-18 10:29:23 264

原创 xshell能连上ubuntu24而vscode连接不上_临时关闭 Windows 防火墙

总而言之,临时关闭防火墙是一个有效的故障排除方法,但必须以审慎的态度对待。强烈建议您优先尝试为特定程序添加防火墙规则,如果必须关闭,请务必在操作完成后尽快重新开启,以保障计算机安全。希望这些信息能帮助您顺利完成操作!如果您在具体步骤中遇到任何问题,或者想了解更多关于配置防火墙规则的细节,随时可以告诉我。

2025-12-18 08:41:04 468

原创 布隆过滤器

布隆过滤器是一种空间效率极高的概率型数据结构,核心作用是快速判断「一个元素是否存在于集合中」。说「元素不在」→ 100%准确(绝对没在集合里);说「元素在」→ 可能误判(有小概率其实不在);极致省空间(比传统Set/哈希表省几个数量级)。布隆过滤器的核心是「用空间换时间+概率妥协」,适合「允许小概率误判、追求极致空间效率」的场景。按公式计算最优的m和k;实现均匀分布的哈希函数;对位数组进行高效的置1/检查操作。

2025-12-14 21:43:30 638

原创 std::promise 重难点

自定义异常需继承并实现what()// 自定义异常(专业写法)private:string msg;public:// 必须实现what(),且标记noexcept// 子线程抛自定义异常try {throw BusinessException("订单不存在");cout << "业务异常:" << e.what() << endl;// 订单不存在t.join();return 0;核心规则通俗记忆专业要点绑定规则。

2025-12-14 19:25:31 887

原创 大白话Proactor模式

Reactor处理IO就绪事件(“数据可以读了,你自己来拿”);Proactor处理IO完成事件(“数据已经给你读好了,你直接用”)。Proactor模式的核心是**“异步IO请求 → 操作系统完成IO → 处理完成结果”**,通俗易懂的讲就是:你只管“下单”(发起IO请求),剩下的交给别人做,做好了通知你“收货”(处理结果)。原生Proactor(Linux AIO)仅适用于文件IO;网络IO的Proactor需用“Reactor+线程池”模拟;

2025-12-13 18:50:12 940

原创 大白话Reactor模式

用epoll/select批量监控所有连接(经理盯面板);连接有事件才处理(顾客有需求才喊服务员);分工明确(迎宾管接客,点餐员管服务)。定义统一的接口(服务员手册);封装Reactor核心(经理),处理epoll的增删改查;实现Acceptor(迎宾)和Connection(点餐员),处理具体事件。实际项目中不用自己写全套(有成熟库如muduo、Asio),但理解这个模式,就能看懂Redis、Nginx这些高性能软件的底层逻辑了。

2025-12-13 18:32:58 887

原创 QT 架构笔记

QT 6 的设计目标是解决 QT 5 时代积累的模块依赖复杂、跨平台适配成本高、多线程性能瓶颈等问题,通过将庞大的 QT Widgets、QT Gui 模块拆分为更细粒度的组件,如将原 QT Gui 中的图形渲染功能独立为 QT Shader Tools,将字体处理模块分离为 QT Font Database。是 QT 跨平台实现的核心。Qt Quick Controls 提供了轻量级的 QML 类型,用于为桌面、嵌入式和移动设备创建性能良好的用户界面,这些控件具有统一的外观和感觉,同时支持主题定制。

2025-12-09 08:50:01 593

原创 CMake 编译选项全面详解

CMake 编译选项全面详解

2025-12-01 00:21:34 889

原创 第20章_程序的执行_《深入理解Linux内核(第三版)》

ELF格式的核心地位:ELF是Linux的主流可执行格式,其程序头表、节头表、入口地址、操作系统标识是理解加载流程的基础,必须掌握“段与节的区别”“程序头表的作用”。可执行格式与执行域的协同:格式负责“解析文件”,执行域负责“兼容系统ABI”,二者结合实现“跨格式、跨系统”程序执行,这是Linux兼容设计的核心。execve系统调用的流程:从用户态封装到内核态解析、地址空间重建、入口设置,每一步的关键操作(如路径解析、权限检查、格式匹配)必须清晰,尤其是“地址空间替换”与“PID不变”的矛盾统一。

2025-11-23 18:24:24 57

原创 CMakeLists.txt和Makefile的差别

特性Makefile核心角色构建脚本(直接执行)构建配置文件(生成构建脚本)跨平台性差(主要支持类 Unix)好(核心优势)语法独特、严格、偏向命令式现代、简洁、偏向声明式可读性较低,尤其是复杂项目较高依赖管理手动管理或借助外部工具自动推导功能基础编译链接强大且丰富(查找库、安装、测试等)适用项目规模小型中大型学习曲线较陡(语法特殊)中等(概念多但逻辑清晰)生态系统较小庞大(广泛用于开源项目)

2025-11-21 23:03:58 70

原创 -o0、-o1、-o2、o3优化的差别

特性-O0(无优化)-O1(基础优化)-O2(充分优化)-O3(极致优化)核心目标快速编译,易于调试基本性能提升最佳性价比,平衡性能与编译时间极致性能编译速度非常快快较慢非常慢可执行文件大小大中小可能最大运行速度非常慢中快可能最快可调试性非常好一般差非常差内存占用 (编译时)低中高非常高风险无低低中等 (可能引入bug)适用场景开发/调试快速测试,对性能有一定要求生产环境默认计算密集型,已充分测试的代码。

2025-11-21 21:49:43 98

原创 CMake的Debug 模式的编译选项_复习

除了默认选项,你通常还需要添加自己的编译标志,比如开启更多警告、启用地址 sanitizer 等。指定构建类型: 使用命令行参数。默认行为: CMake 会自动设置-g和-O0(GCC/Clang) 等基础调试选项。自定义选项推荐使用和。结合生成器表达式来精准控制。开启严格的警告 (启用 Sanitizers () 来捕获内存错误。调试符号与优化: 根据需求选择-g-g3和-O0-Og。

2025-11-21 21:40:19 81

原创 C++14和C++17异同

总的来说,C++14 主要是对 C++11 的完善和优化,而 C++17 则是一次意义重大的更新,它带来了更多能够改变编程范式、提升代码质量和运行效率的特性。在实际项目中,如果条件允许(编译器等工具链支持),升级到 C++17 通常是值得的。你可以从使用处理可选值、用避免字符串拷贝、用结构化绑定处理多返回值等场景开始,逐步体验现代 C++ 带来的便利与强大。

2025-11-21 21:21:33 698

原创 进程间通信方式_复习

进程间通信的核心是“突破地址空间隔离”,不同IPC方式的差异本质是数据存储位置(内核/内存/网络)和同步机制的不同。实际开发中需根据“效率、可靠性、适用范围”选择合适的方式,同时注意资源清理(如删除消息队列、共享内存、信号量),避免系统资源泄漏。

2025-11-21 08:58:35 53

原创 git revert -m 记录

理解选项的区别确实关键,它直接影响到撤销合并操作后代码库的状态。

2025-11-19 11:29:40 368

原创 第19章_进程通信_《深入理解Linux内核(第三版)》

资源持久化:IPC资源独立于进程生命周期,创建后需显式释放(进程退出不自动销毁),由内核统一管理。标识方式:通过“键值(key)”和“标识符(ID)”关联——键值是用户态进程创建/访问IPC资源的“索引”,标识符是内核分配的唯一标识(对应用户态可见的资源句柄)。权限控制:基于ipc_perm结构实现类文件权限(所有者、组、其他用户的读/写/执行权限),与文件系统权限模型兼容。IPC资源的“键值-标识符-权限”三重管理:理解ipc_perm。

2025-11-19 09:05:31 591

原创 Dante 音频 + 视频专用协议

Dante音频+视频专用协议融合方案不是简单叠加,而是优势互补的系统级创新音频优势保留:Dante提供专业级无损音频和微秒级同步,这是任何视频协议无法单独实现的视频传输增强:通过与SRT/NDI/RTMP等视频协议集成,Dante突破了自身视频能力的局限,适应更广泛场景统一管理:Dante Controller和DDM平台提供单一控制点,简化复杂系统的管理和维护选择建议。

2025-11-18 08:28:55 331

原创 拉流和推流协议

速度排名推流:WebRTC (最快) > SRT > RTSP > HTTP-FLV > RTMP > HLS/DASH (最慢)拉流:RTSP (最快) > WebRTC > HTTP-FLV > LL-HLS > DASH > 标准HLS (最慢)最新发展方向WebRTC标准化:WHIP/WHEP成为IETF标准,简化与传统流媒体集成低延迟HLS:LL-HLS成熟,延迟降至2-3秒,兼顾兼容性和实时性QUIC应用:Media over QUIC (MOQ)开始商用,连接建立时间减少66%

2025-11-18 00:10:53 547

原创 分辨率、帧率、码率

FFmpeg 是一个开源的跨平台音视频处理库,包含了音视频的编解码、封装、解封装、滤镜、播放等功能。核心库:libavcodec:音视频编解码库libavformat:音视频封装/解封装库libavfilter:音视频滤镜库libavdevice:输入/输出设备库libavutil:通用工具库在// ... 其他像素格式在中,AVRationalint num;// 分子int den;// 分母帧率通常表示为AVRational24fps →{24, 1}25fps →。

2025-11-17 23:49:08 746

原创 第18章_Ext2和Ext3文件系统_《深入理解Linux内核》

重点难点Ext2的块组布局与超级块、inode的作用Ext2的多级间接块地址映射(计算最大文件大小)inode的结构与块指针分布Ext3日志机制的实现(日志记录、提交/恢复流程)Ext2的磁盘空间分配策略(块/inode分配)Ext3三种日志模式的区别与适用场景Ext3与Ext2的兼容性设计日志与数据的同步机制(避免数据不一致)第18章围绕Ext2和Ext3的实现展开,Ext2的核心是“高效的磁盘布局+多级块映射”,解决了小文件快速访问和大文件存储的需求;

2025-11-17 23:30:48 781

原创 Linux 系统下使用 C 语言实现的简单 TCP 服务器

上述代码只能处理一个客户端连接,处理完后程序就会退出。是 Linux 下最高效的 I/O 多路复用技术,适合处理高并发场景。

2025-11-17 23:23:29 868

原创 Linux内核态和用户态的区别

核心结论:Linux内核态与用户态是基于「特权隔离+资源管控」的核心设计,通过CPU特权分级、地址空间隔离、严格切换机制,实现系统安全、稳定与资源有序分配,两者在特权级别、资源访问、运行职责、故障影响等维度存在本质差异,且配合完成所有系统操作。

2025-11-17 23:08:16 515

原创 std::shared_ptr 为什么要计数?使用场景?

自动管理生命周期:无需手动调用deleteshared_ptr根据计数自动判断何时释放对象。安全共享所有权:多个指针可以放心地指向同一个对象,不用担心“谁该释放”“何时释放”的问题。避免双重释放和内存泄漏:计数为0时才释放对象,确保对象只被释放一次;只要有指针引用,对象就不会被提前释放。计数的目的通过引用计数,实现了“多个指针共享同一个对象”的安全管理,核心是解决双重释放和内存泄漏问题。核心场景:多线程共享对象、容器存储动态对象、复杂结构的循环引用(配合weak_ptr。

2025-11-16 22:06:53 878

原创 详解std::enable_shared_from_this

是一个工具,用于让一个已经被管理的对象能够安全地获取指向自身的。核心方法是,它返回一个与现有shared_ptr共享所有权的shared_ptr。核心原理是基类内部维护了一个weak_ptr,当第一个shared_ptr指向对象时,这个weak_ptr被初始化。就是通过来获取shared_ptr的。使用条件类必须公有继承。对象必须由管理。不要在构造函数中调用。典型应用场景需要将对象自身的指针作为参数传递给其他函数,同时希望延长对象的生命周期。在异步回调中,确保回调执行时对象仍然有效。

2025-11-16 22:00:36 813

原创 第17章_页框回收与交换_《深入理解Linux内核(第三版)》

当页框回收无法满足内存申请(free页框持续<min,且无更多可回收页),内核触发,选择“最该杀死”的进程释放内存,这是内存管理的“最后防线”。重难点核心内容易混淆点/注意事项LRU链表机制4个LRU链表(active_anon/inactive_anon/active_file/inactive_file)的维护混淆“匿名页/文件页”与“active/inactive”的分离逻辑;忘记PG_active标志的作用swap机制。

2025-11-15 18:00:46 818

C++基于Lambda表达式的匿名函数对象设计:现代C++编程中STL算法与函数式编程的高效实现

内容概要:本文系统介绍了C++ Lambda表达式的语法结构、捕获机制、高级应用及其与STL算法的结合使用。文章从基础语法入手,详细讲解了捕获列表(值捕获、引用捕获、混合捕获、初始化捕获)、mutable关键字、返回类型推导等核心概念,并深入剖析其实现原理。进一步涵盖了泛型Lambda、递归Lambda、constexpr Lambda、结构化绑定等C++14至C++23的进阶特性。同时展示了Lambda在STL算法(如sort、find_if、transform、accumulate等)和多线程编程中的实战应用,并通过丰富的代码示例和常见陷阱分析,帮助读者全面掌握这一现代C++核心特性。; 适合人群:具备一定C++基础的开发人员,尤其是希望深入理解现代C++特性、提升代码简洁性与效率的中级程序员,以及准备C++技术面试的求职者。; 使用场景及目标:① 掌握Lambda表达式在STL算法中的高效应用,替代传统函数指针和仿函数;② 理解不同捕获方式的底层原理与生命周期管理,避免悬空引用等常见陷阱;③ 学习泛型、递归、constexpr等高级Lambda技术,应用于函数式编程、多线程和性能敏感场景。; 阅读建议:建议结合文中提供的大量代码示例进行实践,重点关注捕获机制的差异与陷阱,并通过文末的实战练习巩固所学。在学习过程中,应区分不同C++标准(C++11/14/17/23)引入的特性,以适应实际项目的编译环境。

2025-11-17

《设计模式的艺术》复习记录

创建型模式: 单例模式、简单工厂模式、 工厂方法模式、抽象工厂模式、原型模式和建造者模式

2024-05-04

php登录注册页面

简洁的登录注册页面,能实现注册数据同步到接数据库。

2018-12-20

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除