news 2026/9/24 22:37:09

自学嵌入式day34,ipc进程间通信

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
自学嵌入式day34,ipc进程间通信

IPC(进程间通信)概述

进程空间独立,但进程间常需数据共享或交换,因此需要IPC机制。IPC允许不同进程高效协作,例如数据传输、同步操作等。IPC方式多样,可根据需求选择。

IPC主要种类
  1. 古老通信方式:包括无名管道、有名管道和信号。
  2. IPC对象通信:如共享内存、信号量集(消息队列相对少用)。
  3. Socket通信:适用于网络环境。

管道底层实现基于队列,支持高效数据传输。下面重点讨论无名管道和有名管道。


无名管道(匿名管道)

无名管道仅适用于有亲缘关系的进程(如父子进程)。它基于文件描述符操作,特性如下:

  • 半双工模式:通常用作单工(单向通信)。
  • 不支持定位操作(如lseek)。
  • 使用文件IO(open,read,write,close)或标准IO(带缓冲区)。
  • 阻塞行为:
    • 读端存在时,写操作超过64KB会阻塞。
    • 写端存在时,读操作在管道为空时会阻塞。
    • 读端关闭后,写操作会导致写进程退出。
    • 写端关闭后,读操作返回0表示结束。
编程步骤
  1. 创建管道。
  2. 读写管道。
  3. 关闭管道。
函数原型
int pipe(int pipefd[2]);
  • 功能:创建并打开无名管道。
  • 参数:
    • pipefd[0]:固定读端。
    • pipefd[1]:固定写端。
  • 返回值:成功返回0,失败返回-1。

示例使用:

#include <unistd.h> #include <stdio.h> int main() { int pipefd[2]; pid_t pid; if (pipe(pipefd) == -1) { perror("pipe error"); return -1; } pid = fork(); if (pid == 0) { // 子进程:写数据 close(pipefd[0]); // 关闭读端 write(pipefd[1], "Hello", 6); close(pipefd[1]); } else if (pid > 0) { // 父进程:读数据 close(pipefd[1]); // 关闭写端 char buf[10]; read(pipefd[0], buf, sizeof(buf)); printf("Received: %s\n", buf); close(pipefd[0]); } return 0; }

有名管道

有名管道(FIFO)适用于任意单机进程,在文件系统中可见(有路径名)。特性与无名管道一致,额外特性:

  • 一端未打开时,open函数会阻塞。
编程步骤
  1. 创建有名管道。
  2. 打开有名管道。
  3. 读写管道。
  4. 关闭管道。
  5. 卸载有名管道(可选)。
函数原型
int mkfifo(const char *pathname, mode_t mode);
  • 功能:创建有名管道文件。
  • 参数:
    • pathname:文件路径和名称。
    • mode:八进制权限(如0666)。
  • 返回值:成功返回0,失败返回-1。

示例使用:

#include <sys/stat.h> #include <fcntl.h> #include <unistd.h> int main() { const char *fifo_path = "/tmp/myfifo"; // 创建有名管道 if (mkfifo(fifo_path, 0666) == -1) { perror("mkfifo error"); return -1; } // 进程A:写数据 int fd = open(fifo_path, O_WRONLY); write(fd, "Data from A", 12); close(fd); // 进程B:读数据 fd = open(fifo_path, O_RDONLY); char buf[20]; read(fd, buf, sizeof(buf)); close(fd); // 可选:卸载管道 unlink(fifo_path); return 0; }

总结

  • 无名管道适合亲缘进程,简单高效。
  • 有名管道扩展至任意进程,但需文件系统管理。
  • 管道通信需注意阻塞和关闭行为,避免死锁或数据丢失。实际应用中,结合进程同步机制(如信号量)可增强可靠性。
版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/24 1:08:11

华为交换机常用查询命令

华为交换机&#xff08;基于 VRP 操作系统&#xff09;的常用查询命令可按功能分类&#xff0c;涵盖设备状态、接口、VLAN、路由、MAC/ARP、堆叠等核心场景&#xff0c;以下是高频实用命令汇总&#xff1a; 一、设备基础信息查询查看设备型号、版本及运行时间 display version作…

作者头像 李华
网站建设 2026/9/24 1:08:00

安全,在聆听与回答之间生长:威尔德定理赋能智慧安全新生态

安全隐患为何总在沉默中爆发&#xff1f;只因多数管理忘了沟通的本质&#xff01;英国管理学家威尔德的“始于聆听&#xff0c;终于回答”定理&#xff0c;恰是破解之道。当 AI 智能算法聆听设备隐患数据&#xff0c;当安全管理团队倾听一线心声&#xff0c;听与答的双向闭环便…

作者头像 李华
网站建设 2026/9/24 1:07:49

CVE-2025-14780:雄威智慧餐饮云平台SQL注入漏洞深度分析

CVE-2025-14780: 雄威智慧餐饮云平台中的SQL注入漏洞 严重性&#xff1a; 中等 类型&#xff1a; 漏洞 CVE编号&#xff1a; CVE-2025-14780 在雄威智慧餐饮云平台 2.1.6446.28761 版本中发现一个漏洞。受影响的是文件 /dishtrade/dish_trade_detail_get 中的一个未知函数。对…

作者头像 李华
网站建设 2026/9/24 1:07:37

【完整源码+数据集+部署教程】铁路道口交通工具检测系统源码分享[一条龙教学YOLOV8标注好的数据集一键训练_70+全套改进创新点发刊_Web前端展示]

一、背景意义 随着城市化进程的加快&#xff0c;交通流量的急剧增加使得交通安全问题日益突出&#xff0c;尤其是在铁路道口这一特殊的交通节点。铁路道口是铁路与公路交叉的地方&#xff0c;往往是交通事故的高发区域。根据统计数据&#xff0c;铁路道口事故不仅造成了人员伤亡…

作者头像 李华
网站建设 2026/9/24 9:37:14

云原生领域 Docker 多阶段构建的妙用

云原生领域 Docker 多阶段构建的妙用 关键词&#xff1a;Docker、多阶段构建、云原生、镜像优化、微服务、DevOps、容器化 摘要&#xff1a;在云原生架构中&#xff0c;Docker 容器镜像的高效构建与分发是核心挑战之一。本文深入探讨 Docker 多阶段构建&#xff08;Multi-Stage…

作者头像 李华