自学嵌入式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;
}

总结

  • 无名管道适合亲缘进程,简单高效。
  • 有名管道扩展至任意进程,但需文件系统管理。
  • 管道通信需注意阻塞和关闭行为,避免死锁或数据丢失。实际应用中,结合进程同步机制(如信号量)可增强可靠性。
相关推荐
小羽网安10 小时前
Linux 服务器如何进行安全加固?
linux·服务器·安全
倔强的胖蚂蚁10 小时前
AI 人工智能配置管理 Nginx
运维·nginx·云原生
上海云盾安全满满10 小时前
服务器如果做好日常维护,有什么作用
运维·服务器
正在走向自律10 小时前
企业级数据库存储运维实战:表空间自动创建与存储架构深度优化
运维·数据库·架构·表空间
csdn_aspnet10 小时前
.Net 解决 Web API 中的“服务器响应状态码为 405(方法不允许)”错误
服务器·.net·webapi
念风11 小时前
[Linux学习笔记]Uboot-DM的分析过程
linux
想唱rap11 小时前
计算机网络基础
linux·计算机网络·mysql·ubuntu·bash
饼瑶11 小时前
Isaac Sim 5.1.0 部署指南(实验室服务器)
服务器·仿真·具身智能
Agent产品评测局11 小时前
图片生成智能体哪家好?2026年企业级视觉创作与自动化选型全景横评
运维·人工智能·ai·自动化
fetasty11 小时前
chroot的Linux服务配置-当云服务器真正用起来
android·linux·服务器