c/c++ 里的进程间通信 , 管道 pipe 编程举例

(1)以下是一个网上的使用 pipe 编程的范例:

c 复制代码
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <string.h>
#include <sys/types.h>
#include <sys/wait.h>

int main() {
    int pipefd[2];
    pid_t pid;
    char writeMsg[] = "Hello from parent process!";
    char readMsg[100];

    // 创建管道
    if (pipe(pipefd) == -1) {
        perror("pipe");
        exit(EXIT_FAILURE);
    }

    // 创建子进程
    pid = fork();
    if (pid == -1) {
        perror("fork");
        exit(EXIT_FAILURE);
    }

    if (pid > 0) { // 父进程
        close(pipefd[0]); // 关闭读取端

        // 向管道写入消息
        write(pipefd[1], writeMsg, strlen(writeMsg) + 1); // +1 是为了包含终止符 '\0'
        close(pipefd[1]); // 写入完成后关闭写入端

        wait(NULL);       // 等待子进程结束
    }
     else  { // 子进程
        close(pipefd[1]); // 关闭写入端

        // 从管道读取消息
        ssize_t numBytes = read(pipefd[0], readMsg, sizeof(readMsg) - 1);
        if (numBytes == -1) {
            perror("read");
            exit(EXIT_FAILURE);
        }
        readMsg[numBytes] = '\0'; // 添加字符串终止符

        // 打印读取的消息
        printf("Received message: %s\n", readMsg);
        close(pipefd[0]); // 读取完成后关闭读取端
    }

    return 0;
}

(2)上面引用了 wait() 函数,给出其定义:

(3)再给出 linux 0.11 里很重要的管道文件的创建源码:

(4)文件都对应 inode 节点,接着给出文件描述符 ,file 文件结构 ,inode 节点结构的定义与关联关系:

(5)读写管道,主要依赖于 linux 0.11 系统的这俩系统函数:

(6)给出我自己的简单版的 实验结果:

(7)

谢谢

相关推荐
无限进步_16 小时前
深入理解顺序表:从原理到完整实现
c语言·开发语言·数据结构·c++·算法·链表·visual studio
芯联智造16 小时前
【stm32简单外设篇】- 水银开关
c语言·stm32·单片机·嵌入式硬件
繁华似锦respect16 小时前
C++ 无锁队列(Lock-Free Queue)详细介绍
linux·开发语言·c++·windows·visual studio
liu****16 小时前
九.操作符详解
c语言·开发语言·数据结构·c++·算法
ALex_zry16 小时前
C语言底层编程与Rust的现代演进:内存管理、系统调用与零成本抽象
c语言·算法·rust
666HZ66616 小时前
C语言——交换
c语言·c++·算法
w***954916 小时前
在21世纪的我用C语言探寻世界本质——字符函数和字符串函数(2)
c语言·开发语言
Mr_WangAndy16 小时前
C++14 新特性_第二章 C++14 标准库特性_std::exchange,std::quoted
c++·exchange·c++40周年·quoted·c++14新特性
无限进步_16 小时前
基于顺序表的通讯录系统设计与实现
c语言·开发语言·数据结构·c++·后端·算法·visual studio
雨落在了我的手上16 小时前
C语言入门(二十四):数据在内存中的存储
c语言