news 2026/9/11 22:21:33

嵌入式第三十八篇——linux系统编程——IPC进程间通信

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
嵌入式第三十八篇——linux系统编程——IPC进程间通信

一、无名管道(Unnamed Pipe)

1. 核心定义

无名管道(简称pipe)是仅支持有亲缘关系进程(如父子、兄弟进程,由同一进程 fork 创建)间通信的临时 IPC 机制,无文件系统实体,仅存在于内存中。

2. 核心特性

  1. 半双工通信:数据只能单向流动,实际编程中通常按单工模式使用(如需双向通信,需创建两个管道)。
  2. 不支持定位操作:管道是流式文件,无法使用lseek(文件 IO)或fseek(标准 IO)进行偏移定位。
  3. 文件操作方式
    • 首选文件 IOopen/read/write/close),无缓冲区,效率更高;
    • 可选标准 IOfgets/fread/fgetc等),但存在缓冲区,需注意数据同步问题。
  4. 阻塞与异常行为(关键):
    场景行为
    读端存在,写端写入超过 64KB写操作阻塞(管道缓冲区默认大小为 64KB)
    写端存在,管道为空时读操作读操作阻塞(等待写端写入数据)
    读端关闭,写端继续写管道管道破裂,写进程被信号终止(SIGPIPE)
    写端关闭,管道无数据时读操作read返回 0(表示通信结束)

3. 编程接口

(1)创建管道函数
#include <unistd.h> int pipe(int pipefd[2]);
  • 功能:创建并打开一个无名管道,返回两个文件描述符。
  • 参数pipefd[0]为管道的读端(固定),pipefd[1]为管道的写端(固定)。
  • 返回值:成功返回 0,失败返回 - 1(并设置errno)。

4. 编程步骤

  1. 创建管道:调用pipe()函数生成读、写端文件描述符。
  2. 创建子进程:调用fork()生成子进程(子进程继承管道描述符)。
  3. 关闭无用端:父子进程分别关闭不需要的读 / 写端(如父进程写、子进程读,则父进程关读端,子进程关写端)。
  4. 读写管道:通过read()/write()进行数据传输。
  5. 关闭管道:通信结束后,关闭剩余的读 / 写端描述符。

二、有名管道(FIFO)

1. 核心定义

有名管道(简称FIFO,First In First Out)是支持任意单机进程(无亲缘关系也可)间通信的 IPC 机制,在文件系统中存在实体文件(有路径和名称),但文件内容仅存于内存中。

2. 核心特性

  • 继承无名管道的所有特性:半双工、不支持定位、阻塞 / 异常行为与无名管道一致。
  • 额外特性
    1. 文件系统可见:通过ls命令可看到 FIFO 文件(文件类型为p)。
    2. open 函数的阻塞特性:若只打开 FIFO 的读端或写端,open()会阻塞,直到另一端也被打开(可通过O_NONBLOCK设置非阻塞模式)。

3. 编程接口

(1)创建有名管道函数
#include <sys/stat.h> int mkfifo(const char *pathname, mode_t mode);
  • 功能:在指定路径下创建一个有名管道文件。
  • 参数
    • pathname:要创建的 FIFO 文件的路径 + 名称(如./myfifo)。
    • mode:FIFO 文件的权限(8 进制数,如0664,最终权限会受umask影响)。
  • 返回值:成功返回 0,失败返回 - 1(并设置errno,如文件已存在时errnoEEXIST)。

4. 编程步骤

  1. 创建 FIFO 文件:调用mkfifo()创建有名管道(若已存在可跳过)。
  2. 打开 FIFO 文件:进程通过open()函数打开 FIFO(指定O_RDONLY/O_WRONLY,可选O_NONBLOCK)。
  3. 读写管道:通过read()/write()进行数据传输(与文件操作一致)。
  4. 关闭管道:通信结束后,调用close()关闭文件描述符。
  5. 卸载 FIFO:通过unlink()rm命令删除文件系统中的 FIFO 实体文件(可选,若后续还需使用可保留)。

三、无名管道与有名管道的核心区别

特性无名管道(Pipe)有名管道(FIFO)
适用进程仅有亲缘关系进程任意单机进程
文件系统实体无(仅内存中存在)有(可见的 FIFO 文件)
创建方式pipe()函数mkfifo()函数
打开方式继承描述符,无需 open需调用open()函数
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 10:06:32

掌握这4种异常处理模式,轻松应对Open-AutoGLM解密崩溃危机

第一章&#xff1a;Open-AutoGLM 数据解密异常处理在使用 Open-AutoGLM 框架进行数据处理时&#xff0c;解密环节常因密钥不匹配、数据格式错误或加密算法版本差异引发异常。为确保系统稳定运行&#xff0c;需建立完善的异常捕获与恢复机制。异常类型识别 常见的解密异常包括&a…

作者头像 李华
网站建设 2026/9/11 12:49:28

如何在30分钟内完成Open-AutoGLM加密传输配置?高效运维必看

第一章&#xff1a;Open-AutoGLM加密传输协议概述Open-AutoGLM 是一种专为大语言模型服务间通信设计的高性能加密传输协议&#xff0c;旨在保障数据在分布式推理与训练场景下的机密性、完整性与低延迟传输。该协议融合了现代密码学机制与自适应流量控制策略&#xff0c;适用于高…

作者头像 李华
网站建设 2026/9/9 21:08:35

NetSupport Manager 路径遍历漏洞 (CVE-2025-34181) 技术深度解析

CVE-2025-34181: CWE-22 NetSupport Software Manager 中对路径名指向受限目录的限制不当&#xff08;路径遍历&#xff09; 严重性&#xff1a;高 类型&#xff1a;漏洞 CVE-2025-34181 NetSupport Manager 版本 < 14.12.0001 在其连接服务器/网关的 PUTFILE 请求处理器中存…

作者头像 李华
网站建设 2026/9/11 1:44:34

Electron 实战项目

以下是一些非常适合学习 Electron 的实战项目&#xff0c;它们从简单到复杂&#xff0c;覆盖了 Electron 开发中几乎所有核心知识点和常见场景。这些项目在 2024–2025 年仍然是社区公认的优秀学习材料&#xff0c;且很多都有活跃的更新。 序号项目名称技术栈 / 特点学习价值&…

作者头像 李华
网站建设 2026/9/11 22:42:15

Open-AutoGLM解密异常频发?(企业级容错架构设计实践)

第一章&#xff1a;Open-AutoGLM 数据解密异常处理在 Open-AutoGLM 框架中&#xff0c;数据解密是模型推理前的关键步骤。由于加密数据可能来自不同源或使用不一致的密钥策略&#xff0c;解密过程中常出现格式错误、密钥不匹配或完整性校验失败等异常情况。为保障系统稳定性&am…

作者头像 李华
网站建设 2026/9/10 10:54:36

你还在用传统加密?Open-AutoGLM的这4个优势已彻底改写行业规则

第一章&#xff1a;Open-AutoGLM 数据加密算法选择在构建 Open-AutoGLM 系统时&#xff0c;数据安全是核心考量之一。为确保模型训练数据、推理请求及用户信息的机密性与完整性&#xff0c;必须选择合适的加密算法。系统采用分层加密策略&#xff0c;针对静态数据、传输中数据和…

作者头像 李华