【DeepSeek-R1代码相似度引擎解密】:3层语义比对机制、Token归一化偏差修正与Jaccard阈值黄金分割点
2026/5/26 3:17:34
进程空间都是独立的(虚拟地址空间隔离)
但进程之间有数据共享或交换需求
需要一种机制让进程间能够通信
无名管道(匿名管道)
有名管道(FIFO)
信号(Signal)
注意:管道是自动申请资源并继续运行程序
消息队列(用的相对少,不讨论)
共享内存
信号量集
主要用于:System V、BSD、SUSE、Fedora、kernel.org等系统
主要用于网络通信
也可用于本地进程间通信
底层数据结构:队列(先进先出)
无名管道(Unnamed Pipe)=>pipe
只能用于有亲缘关系的进程通信(如父子进程)
半双工工作模式
实际编程中,通常当作单工使用
所有管道都是特殊文件
不支持定位操作
lseek→ 用于文件描述符
fseek→ 用于FILE*
建议使用文件IO:open,read,write,close
可选使用标准IO(带缓冲区):fgets,fread,fgetc
创建管道 → fork → 读写管道 → 关闭管道
读端存在,一直向管道写: - 超过64K(默认缓冲区大小)→ 写会阻塞 - 原因:写段写的太快
写端存在,从管道读: - 如果管道为空 → 读会阻塞 - 原因:读段读的太快
读端关闭,继续写管道: - 导致写段进程收到SIGPIPE信号 - 默认行为:进程退出
写端关闭,读管道: - 如果管道没有内容 → read返回0 - 表示:进程间通信结束
有名管道 =>fifo
可以用于任意单机进程通信
在文件系统中可见(有文件名称)
创建有名管道 → 打开有名管道 → 读写管道 → 关闭管道 → 卸载有名管道
具有无名管道所有特性
额外特性:
如果有一端没有打开
open函数会阻塞直到另一端也打开
pipe函数int pipe(int pipefd[2]);
功能:创建并打开一个无名管道
参数:
pipefd[0]→ 无名管道的固定读端
pipefd[1]→ 无名管道的固定写端
返回值:
成功:0
失败:-1
mkfifo函数int mkfifo(const char *pathname, mode_t mode);
功能:在指定路径下创建有名管道文件
参数:
pathname→ 要创建的有名管道路径+名称
mode→ 八进制文件权限(如0666)
返回值:
成功:0
失败:-1
| 特性 | 无名管道 | 有名管道 |
|---|---|---|
| 关系要求 | 必须有亲缘关系 | 任意进程 |
| 文件可见性 | 不可见 | 文件系统可见 |
| 创建方式 | pipe() | mkfifo() |
| 打开阻塞 | 不适用 | open会阻塞 |
| 生命周期 | 随进程结束 | 持久存在直到删除 |
管道是半双工的,但通常按单工使用
管道不能定位,只能顺序读写
注意处理管道破裂(SIGPIPE信号)
读写阻塞是正常现象,需要合理设计程序逻辑
及时关闭不需要的文件描述符,避免资源泄漏