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

IPC(进程间通信)概述

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

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

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


无名管道(匿名管道)

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

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

示例使用:

c 复制代码
#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. 卸载有名管道(可选)。
函数原型
c 复制代码
int mkfifo(const char *pathname, mode_t mode);
  • 功能:创建有名管道文件。
  • 参数 :
    • pathname:文件路径和名称。
    • mode:八进制权限(如0666)。
  • 返回值:成功返回0,失败返回-1。

示例使用:

c 复制代码
#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;
}

总结

  • 无名管道适合亲缘进程,简单高效。
  • 有名管道扩展至任意进程,但需文件系统管理。
  • 管道通信需注意阻塞和关闭行为,避免死锁或数据丢失。实际应用中,结合进程同步机制(如信号量)可增强可靠性。
相关推荐
网硕互联的小客服4 小时前
Linux服务器磁盘应该如何合理分区?
linux·运维·服务器
楚识科技4 小时前
合同比对全流程自动化:OCR识别+差异比对+法律风险字段抽取实战指南
运维·自动化·ocr
代码方舟4 小时前
零信任架构实战:基于天远人企关联构建自动化供应链金融网关
运维·人工智能·架构·自动化
lisanmengmeng4 小时前
nacos nrpe 监控机及被监控机部署
服务器·nacos·nagios·nrpe
贵沫末5 小时前
Ubuntu——常用软件安装
linux·运维·ubuntu
Doraemomo6 小时前
Linux内核驱动开发——中断与定时器
linux·运维·驱动开发
2301_808414386 小时前
Linux中动静态库的理解
linux·运维·服务器
分布式存储与RustFS6 小时前
模型 checkpoint 放对象存储:分片上传、断点续传与残留清理
运维·云原生·开源·对象存储·分布式存储·s3·性能基准
M78佐菲7 小时前
ARM学习笔记(11)
linux·arm开发·笔记·嵌入式硬件·学习
M78佐菲7 小时前
ARM学习笔记(10)
linux·arm开发·笔记·嵌入式硬件·学习