你还在人工查库存?(Open-AutoGLM自动化监控已淘汰传统模式)
2025/12/22 11:22:35
无名管道(简称pipe)是仅支持有亲缘关系进程(如父子、兄弟进程,由同一进程 fork 创建)间通信的临时 IPC 机制,无文件系统实体,仅存在于内存中。
lseek(文件 IO)或fseek(标准 IO)进行偏移定位。open/read/write/close),无缓冲区,效率更高;fgets/fread/fgetc等),但存在缓冲区,需注意数据同步问题。| 场景 | 行为 |
|---|---|
| 读端存在,写端写入超过 64KB | 写操作阻塞(管道缓冲区默认大小为 64KB) |
| 写端存在,管道为空时读操作 | 读操作阻塞(等待写端写入数据) |
| 读端关闭,写端继续写管道 | 管道破裂,写进程被信号终止(SIGPIPE) |
| 写端关闭,管道无数据时读操作 | read返回 0(表示通信结束) |
#include <unistd.h> int pipe(int pipefd[2]);pipefd[0]为管道的读端(固定),pipefd[1]为管道的写端(固定)。errno)。pipe()函数生成读、写端文件描述符。fork()生成子进程(子进程继承管道描述符)。read()/write()进行数据传输。有名管道(简称FIFO,First In First Out)是支持任意单机进程(无亲缘关系也可)间通信的 IPC 机制,在文件系统中存在实体文件(有路径和名称),但文件内容仅存于内存中。
ls命令可看到 FIFO 文件(文件类型为p)。open()会阻塞,直到另一端也被打开(可通过O_NONBLOCK设置非阻塞模式)。#include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode);pathname:要创建的 FIFO 文件的路径 + 名称(如./myfifo)。mode:FIFO 文件的权限(8 进制数,如0664,最终权限会受umask影响)。errno,如文件已存在时errno为EEXIST)。mkfifo()创建有名管道(若已存在可跳过)。open()函数打开 FIFO(指定O_RDONLY/O_WRONLY,可选O_NONBLOCK)。read()/write()进行数据传输(与文件操作一致)。close()关闭文件描述符。unlink()或rm命令删除文件系统中的 FIFO 实体文件(可选,若后续还需使用可保留)。| 特性 | 无名管道(Pipe) | 有名管道(FIFO) |
|---|---|---|
| 适用进程 | 仅有亲缘关系进程 | 任意单机进程 |
| 文件系统实体 | 无(仅内存中存在) | 有(可见的 FIFO 文件) |
| 创建方式 | pipe()函数 | mkfifo()函数 |
| 打开方式 | 继承描述符,无需 open | 需调用open()函数 |