- 博客(436)
- 资源 (8)
- 收藏
- 关注
原创 IPC之消息队列(3)
IPC 的选择不是“技术问题”,而是“语义问题”。数据流 → socket控制事件 → MQ状态共享 → SHM通知 → signal / eventfd。
2025-12-24 14:46:45
原创 IPC 之管道
管道是内核提供的一种“单向、字节流、有序的进程间通信机制”。单向:一头写,一头读字节流:没有消息边界有序:按写入顺序读取在内核中:不是文件、不是内存共享管道是 Linux 内核提供的、基于内核缓冲区的单向字节流 IPC 机制,常用于父子进程和 shell 管道,依赖文件描述符和阻塞语义完成进程间同步与数据传输。
2025-12-22 20:08:30
17
原创 守护进程(daemon)创建的通用步骤
项目传统 daemonsystemdfork必须不需要setsid必须不需要推荐不需要pidfile常见不需要控制终端程序处理systemd 处理日志syslogjournald。
2025-12-18 17:14:30
19
原创 会话(Session)
会话(session)是 Linux 进程控制与终端管理的最高层级单位,它主要用于:管理终端与进程之间的关系决定哪些进程能接收来自终端的输入和信号支撑前台 / 后台作业控制(job control)可以把会话理解为:“一次用户登录 / 一次终端交互环境”创建会话的进程称为会话首领(session leader)通常通过setsid()创建调用成功后:当前进程成为:新会话的会话首领新进程组的进程组首领sid == pid一个会话最多只能有一个控制终端控制终端通常是:/dev/ttyX。
2025-12-18 16:40:47
15
原创 sigaction()函数讲解
不要在 handler 中调用非 async-signal-safe 函数(例如mallocprintf等)。只做最小工作(设置、写入已打开的 FD)。总是初始化memset全零),并且显式设置sa_mask(用sigaddset在需要获取发送者信息时使用SA_SIGINFO并使用。对可能被中断的系统调用使用SA_RESTART,但不要依赖它能重启所有调用(并非保证)。处理 SIGCHLD 要小心:可用或在 handler 中循环。在多线程程序中尽量用sigwait处理信号,避免异步信号处理器的复杂性。
2025-12-12 16:40:11
21
原创 GPIO的通用初始化流程
使能 GPIO 时钟设置引脚为 GPIO 模式(IOMUX/MUX)配置电气特性(PADCTL)若为输出:先写默认电平设置方向(输入或输出)配置中断(如需要)执行上层注册(仅 OS 系统)验证与测试。
2025-12-10 23:03:25
689
原创 信号(semaphore) 和 锁(mutex)(三)为什么用 很多代码工程里TakeSem/GiveSem 但本质是锁?
历史原因(老 RTOS 没有 mutex)OSAL 统一接口(Sem 作为通用同步 API)兼容旧代码工程师继续沿用命名习惯不想在 API 层区分太多同步原语对业务层隐藏底层 OS 的差异(posix vs RTOS)
2025-12-10 18:09:14
13
原创 信号(semaphore) 和 锁(mutex)(二)二进制信号量 vs mutex 的深入区别
用途用 Mutex用 Binary Semaphore保护共享资源√×跨线程的一次性事件通知×√允许中断唤醒任务×√需要优先级继承√×避免优先级反转√×要求 unlock 必须由持锁线程执行√×(可以跨线程 post)
2025-12-10 17:56:18
23
原创 彻底理解内存对齐
例如:2 字节变量 → 地址必须是 2 的倍数4 字节变量 → 地址必须是 4 的倍数8 字节变量 → 地址必须是 8 的倍数(在 64 位系统中很常见)
2025-12-10 16:19:23
17
原创 在 Cortex-A 的 Linux 裸机开发(Bare-metal, 非操作系统环境)中,为什么必须先学习并使用汇编?
你可能是在做:Linux 启动前的一阶段 bootloader(BL1/BL2)ARM Trusted Firmware 开发启动 u-boot 前的初始化代码编写实验用 mini-OS在 A 级核上跑 bare-metal 程序这些都需要掌握 ARM 的异常级别、启动流程、寄存器操作,直接与硬件对话,而这些核心内容都必须通过汇编启动。因为 Cortex-A 裸机环境没有任何软件支持,必须用汇编建立最基本的执行环境,才能让 C 语言跑起来。如果你跳过汇编,C 就没有运行的地基。
2025-12-09 23:06:42
413
原创 正则表达式
正则表达式(Regular Expression, regex)是一种匹配字符串模式的工具,用来:搜索(search)匹配(match)替换(replace)提取(extract)验证格式(validate)广泛应用于:日志处理、输入校验、文本解析、编译器词法分析。
2025-12-09 16:13:06
73
原创 unlink() 的底层原理
不会触及文件的内容。理由:会破坏目录树结构会导致循环引用、递归遍历崩溃因此:删除目录必须使用但是:内核内部使用 unlink 来实现 rmdir 的部分逻辑(特殊处理)内核维护 inode 的引用计数i_nlink(硬链接数)。a.txt在目录中“消失”但 tail 仍然能读取数据原因:inode 仍然被进程引用(打开着)文件数据仍在磁盘上,不会立即释放只有 tail 退出后,inode 才会真正释放。6. unlink() 底层流程(重要!
2025-12-08 17:31:10
20
原创 chdir() 的作用、内部机制、与内核中的 cwd(当前工作目录)结构的关系
项目内容作用改变当前工作目录影响范围仅影响当前进程(多线程:全进程共享)内核结构修改 task_struct.fs_struct.pwd底层行为路径解析 + 更新 dentry/mount 指针权限要求必须具有目录的执行权限 x删除 cwd 时进程仍可访问,直到退出或 chdir 到别处。
2025-12-08 17:19:53
20
原创 getcwd() 传入 buf = NULL、size = 0 时的行为 和 内核/库函数层面的机制
传入参数getcwd 行为将路径写入 buf,超长则失败glibc 分配 size 大小的缓冲区 → 你必须 free()glibc 自动增长缓冲区以容纳完整路径 → 你必须 free()核心点:getcwd() 返回的指针是 malloc() 分配的,必须 free(),否则内存泄漏。
2025-12-08 16:57:12
16
原创 目录在 Linux 中是如何运作的
部分本质目录是什么?特殊文件,内容是(文件名 → inode)的表..自己和父目录的硬链接删除目录先删父目录中的目录项,再释放 inode打开目录一个 fd 指向目录 inode读取目录进程 cwdtask_struct 中的保存 dentry删除 cwd进程还能访问,但目录对外不可见。
2025-12-08 16:52:04
38
原创 系统级 + 内核级视角的“硬链接 vs 符号链接(软链接)”完整讲解
特性硬链接软链接inode 是否相同✔ 是✘ 否是否依赖原文件路径✘ 不依赖✔ 依赖原文件删除后是否可用✔ 仍可用✘ 失效(变成挂链)是否可跨文件系统✘ 不可✔ 可是否可链接目录大多数情况下 ✘(为防止循环)✔ 可以占用空间几乎不占(目录项)一个实际小文件(存路径)是否能修改目标文件✔ 可以(本质是同一文件)✔ 可以是否表示文件身份(inode)✔ 完全等价✘ 不等价硬链接是文件的多个名字;软链接是指向文件路径的快捷方式。
2025-12-08 15:51:17
23
原创 为什么不能修改 ctime?
ctime 更新的情况包括:(只要 inode 信息被修改)chmodchowntruncatewrite()renameetc…文件的安全属性、权限、所有权或者其他元数据被改变的时间这是文件系统中一个可靠的追踪字段。让用户可以随意修改这个字段将破坏整个安全模型。因为 ctime 用于安全审计。如果允许用户修改,文件系统无法保证文件元数据变化的真实记录,因此内核禁止用户显式修改 ctime。
2025-12-08 15:10:34
15
原创 umask() 函数的完整、系统级讲解
umask(User File Creation Mask)是。(内部也是 creat)不想要不是增加权限,而是。
2025-12-08 14:51:46
16
原创 文件属主之 有效用户 ID 和有效组 ID
在 Linux/Unix 中,和是权限控制的核心概念,用来决定当前进程“以谁的身份访问系统资源”。下面是工程级、系统编程所需的完整解释。
2025-12-06 17:22:21
19
原创 Linux 系统中文件属性 之 文件类型
在 Linux 系统中,“文件类型”并不是按扩展名区分(如 Windows 的 .exe、.txt),而是由决定的。
2025-12-06 15:56:42
28
原创 文件描述符与 FILE 指针互转
方向用法说明fd → FILE*给 fd 加上 stdio 缓冲FILE* → fdfileno(fp)让 FILE 用底层系统 API。
2025-12-04 20:20:27
18
原创 setvbuf / setbuf / setbuffer
功能setvbufsetbufsetbuffer是否标准✔ C 标准✔ C 标准✘ GNU 扩展设置缓冲模式✘✘ 全缓冲固定可否指定缓冲大小✔✘ 固定 BUFSIZ✔需不需要自己提供 buffer可选可选必要灵活性最高最低一般主要用途全面控制关闭或简单设置指定缓冲大小但简单setvbufsetbuffersetbuf内部采用全缓冲_IOFBF。99% 场景:用setvbuf()只想关闭缓冲Linux 且想方便设置 buffer 大小。
2025-12-03 20:29:28
25
原创 stdio 缓冲机制
printf →| stdio 缓冲区 | ———write——→ | 内核 page cache | ———sync——→ | 磁盘 || (用户态) | | (内核态) | | |
2025-12-03 20:08:17
35
原创 Direct I/O(直接 I/O)
Direct I/O = 绕过 Linux Page Cache(内核缓冲) 的 I/O即:用一句话描述:因此:✔ 不使用 page cache✔ 不产生 dirty page✔ 不需要 fsync/fdatasync(因为数据已经写到磁盘)✔ 也不会影响其它文件的缓存大多数应用(文本编辑、普通文件读写)应该使用 page cache,因为它性能好。但以下场景反而不适合 page cache:DB 自己维护 buffer pool(更智能)如果还用 OS 的 page cache === 重
2025-12-02 19:49:03
60
原创 sync()、syncfs()、fsync()、fdatasync()
sync = 全系统异步刷syncfs = 单文件系统异步刷fsync = 文件同步刷(数据+元数据)fdatasync = 文件同步刷(仅数据+关键元数据)
2025-12-02 19:14:05
32
原创 printf()、fprintf()、dprintf()、sprintf()、snprintf()
printf:屏幕fprintf:文件 FILE*dprintf:文件描述符 fdsprintf:字符串(危险)snprintf:字符串(安全)
2025-11-28 10:57:17
21
原创 fseek()
pos >= 0;// 找到一行开头fseek()改变文件指针,下一次读写将从那里开始SEEK_SET:从头SEEK_CUR:从当前位置SEEK_END:从尾部成功返回 0,失败返回非 0常搭配ftell()获得当前偏移切换读/写模式前必须fflush()或调用fseek()对大文件要用fseeko()ftello()在文本模式中使用SEEK_ENDSEEK_CUR不保证正确工程中常用于随机访问、修改文件中间内容、计算文件大小等。
2025-11-26 16:15:57
24
原创 fread() / fwrite()
freadfwrite是二进制 I/O 的基础:返回值为成功处理的“元素数”。永远检查返回值,用feof()ferror()区分 EOF 与错误。为性能优先采用块读写,为可移植性优先做显式序列化(处理端序与填充)。对可能发生短写的场景,循环写直到全部数据写入或出错。对于高可靠性/可移植性或跨语言交互,考虑使用标准序列化格式而不是裸二进制 dump。
2025-11-26 10:46:22
20
原创 fopen()
fopen()打开文件 + 创建文件流对象(FILE)+ 设置缓冲 + 获得底层 fd + 返回可读写句柄它是最常用、最高效、最方便的文件打开方式。
2025-11-26 10:07:10
17
原创 FILE 指针
FILE*是 C 的文件流对象(带缓冲、封装 fd)内部结构包含 fd、缓冲区、状态标志等提供高效、安全、跨平台的文件操作与底层 read/write 不冲突,只是更高级的包装多线程慎用同一个 FILE*
2025-11-25 20:24:19
24
原创 truncate() 与 ftruncate()
按路径直接设置文件的长度。:对已打开的文件描述符设置文件长度。两者作用相同——改变文件的逻辑长度(file size),但接口不同:一个用路径,一个用 fd。
2025-11-25 19:30:40
28
原创 ioctl 函数
当你要控制一个设备,但找不到合适的系统调用时,就用 ioctl。ioctl 是设备控制接口,不是数据读写接口。当 read/write 不能满足时,就用 ioctl。ioctl 使用“命令 + 参数”的形式与驱动通信。每个 ioctl 命令的行为取决于驱动程序如何实现。
2025-11-25 19:18:36
28
软件开发工具实验-数制转化.rar
2021-01-16
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅