Linux 管道理解

news2025/4/24 19:38:24

一、什么是管道

1.1 unix中最古老的进程间通信
1.2 一个进程链接到另一个进程的数据流称为“管道”:

图解:

二、管道通信的原理

2.1当我们创建一个进程然后打开一个文件的时候

会经过以下步骤:

①首先要描述这个进程,为这个进程创建一个task_struct的结构体对象;

②然后通过task_struct结构体里的文件描述符表指针找到这张文件描述符表;

③通过文件描述符表里的指针指向所对应打开的文件;

④文件里包含有inode文件属性、file_operators读写方法、缓冲区;

这时候就可以调用文件的读写方法对这个文件进行操作了!

图解:

2.2 当我们创建一个子进程的时候

此时子进程就能够看到父进程所看到的所有文件!!

进程通信的本质:让不同的进程看到统一份资源!

既然子进程能够看到父进程的内容了,那么父子进程之间怎么进行通信呢??

2.3 约定

想进行通讯父子进程间必须要有一个约定,要么规定父进程写入,子进程读取;或者父进程读取,子进程写入;

然而这样就行了吗?还没有,因为如果父进程是以读的方式打开的文件,子进程继承后也只能以读的方式操作这个文件而不能实现父写子读、父读子写,那怎么办呢?

2.4 方法

①父进程打开文件的时候以读文件打开一次文件,再以写方式打开一次文件(共打开两次同一文件);

②父进程fork子进程后,子进程继承父,并根据实际的场景,关闭父的读+子的写(实现父写子读)或者关闭父的写+子的读(实现父读子写)!

图解:

三、代码实现

3.1 用到的接口

①:建立管道接口

#include <unistd.h>  //头文件
int pipe(int pipefd[2]); //返回值小于0表示失败,pipefd 输出型参数,意思传入一个数组把文件的文件描述符带出来让用户使用!!

记住:pipefd[0] :读下标   pipefd[1] :写下标

②:系统调用写接口

#include<unistd.h> //头文件
ssize_t write(int fd,void*buffer,size_t count);
//fd -> 写入一个被打开的文件的描述符
//buffer -> 作为缓冲区用来写入/读取文件
// count -> 写入的大小
//size_t 写入成功返回写入的字节数,写入失败返回-1

③:系统调用读接口

#include <unistd.h> //头文件
ssize_t read(int fd,void*buffer,size_t count);
//fd ->  被打开的文件的描述符(从哪读)
// buffer -> 读写缓冲区 (读到哪)
// count -> 读取的字节数
// ssize_t -> 读取成功返回读取的字节数,读取失败返回-1,读取到文件末尾返回0

④:fork()函数

#include <unistd.h> //头文件
#include <sys/types.h> //头文件
函数原型
   pid_t fork( void);
  (pid_t 是一个宏定义,其实质是int 被定义在#includesys/types.h>中)
   返回值:若成功调用一次则返回两个值,子进程返回0,父进程返回子进程ID;否则,出错返回-1

⑤:snprintf()函数

#include <stdio.h>//头文件
int snprintf(char* str,size_t size,const char*format,...);
//str -> 写到的位置
// size -> 写到的位置的大小
// format -> 格式字符串
// ... 列表
⑥:waitpid()函数
#include <sys/types.h> 
#include <sys/wait.h>
pid_t waitpid(pid_t pid,int *status,int options);
3.2 linux下实现两个进程之间的管道通信
//testipc1.cpp
#include <unistd.h>
#include <cstdio>
#include <cstring>
#include <sys/wait.h>
#include <sys/types.h>
#include <iostream>
#define SIZE 1024
using namespace std;
void Write(int wfd)
{
    //写入内容
    char buffer[SIZE]={0};//缓冲区
    int number =0;//记录写入次数
    const char*message="hello linux!! i am child!!";
    while (true)
    {
        //子不停写
        snprintf(buffer,sizeof(buffer),"%s - pid:%d -%d\n",message,getpid(),number++);
        write(wfd,buffer,strlen(buffer));
         sleep(2);//每隔两秒写
    }
    
}
void Read(int rfd)
{
    char buffer[SIZE]={0};//缓冲区
    while(true)
    {

   ssize_t redcount= read(rfd,buffer,sizeof(buffer));
   if(redcount){
    buffer[redcount]='\0';
   }
   cout<<buffer<<endl;
    }
}
int main()
{
    int pipefd[2];
    int retpipe=pipe(pipefd);//建立管道
    pid_t id=fork();//创建子进程
    if(id<0)return 1;//创建失败
    else if(id==0)
    {
        //child
        //父读子写,子关闭读
        close(pipefd[0]);
        Write(pipefd[1]);
        exit(0);//子写完退出程序
    }
    else
    //farther
    //父读子写,父关闭写
    close(pipefd[1]);
    Read(pipefd[0]);
    pid_t retpid=(id,NULL,0);
    if(retpid<0)return 3;//等待失败
    return 0;
}
//makefile文件
testipc1:testipc1.cpp ##依赖目标:依赖文件
	g++ -o $@ $^ -std=c++11     
.PHONY:clean
clean:
	rm -f testipc1

测试:

父进程成功读取子进程写入的内容!!

四、总结

4.1、管道的五大特征

①具有血缘关系的进程;

②父子进程会协同,同步与互斥,---保护管道文件的数据安全;

③管道只能单向通信;

④管道是面向字节流的;

⑤管道是基于文件的,而文件的生命周期是随进程的;

4.2、管道的几种情况

①读写端正常,管道如果为空,读端阻塞;

②读写正常,管道写满,写端阻塞;

③读端正常,写端关闭,读端会读到0;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2341904.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

国产RK3568+FPGA以 ‌“实时控制+高精度采集+灵活扩展”‌ 为核心的解决方案

RK3568FPGA方案在工业领域应用的核心优势 一、‌实时性与低延迟控制‌ ‌AMP架构与GPIO中断技术‌ 通过非对称多处理架构&#xff08;AMP&#xff09;实现Linux与实时操作系统&#xff08;RTOS/裸机&#xff09;协同&#xff0c;主核负责调度&#xff0c;从核通过GPIO中断响应紧…

Pycharm(十五)面向对象程序设计基础

目录 一、面向对象基本概述 class 类名: 属性(类似于定义变量) 行为(类似于定义函数,只不过第一个形参要写self) 二、self关键字介绍 三、在类内部调用类中的函数 四、属性的定义和调用 五、魔法方法init方法 六、魔法方法str和del方法 七、案例-减肥 一、…

华三(H3C)与华为(Huawei)设备配置IPsec VPN的详细说明,涵盖配置流程、参数设置及常见问题处理

以下是针对华三&#xff08;H3C&#xff09;与华为&#xff08;Huawei&#xff09;设备配置IPsec VPN的详细说明&#xff0c;涵盖配置流程、参数设置及常见问题处理&#xff1a; 一、华三&#xff08;H3C&#xff09;设备IPsec VPN配置详解 1. 配置流程 华三IPsec VPN配置主要…

店匠科技摘得 36 氪“2025 AI Partner 创新大奖”

全场景 AI 方案驱动跨境电商数智化跃迁 4 月 18 日,36 氪 2025 AI Partner 大会于上海盛大开幕。大会紧扣“Super App 来了”主题,全力探寻 AI 时代的全新变量,探索 AI 领域下一个超级应用的无限可能性。在此次大会上,跨境电商独立站 SaaS 平台店匠科技(Shoplazza)凭借“店匠跨…

Joint communication and state sensing under logarithmic loss

摘要——我们研究一种基本的联合通信与感知设置&#xff0c;其中发射机希望向接收机传输一条消息&#xff0c;并同时通过广义反馈估计其信道状态。我们假设感知目标是获得状态的软估计&#xff08;即概率分布&#xff09;&#xff0c;而非通常假设的点估计&#xff1b;并且我们…

Linux:41线程控制lesson29

1.线程的优点&#xff1a; • 创建⼀个新线程的代价要⽐创建⼀个新进程⼩得多 创建好线程只要调度就好了 • 与进程之间的切换相⽐&#xff0c;线程之间的切换需要操作系统做的⼯作要少很多 为什么&#xff1f; ◦ 最主要的区别是线程的切换虚拟内存空间依然是相同的&#x…

HTMLCSS实现网页轮播图

网页中轮播图区域的实现与解析 在现代网页设计中&#xff0c;轮播图是一种常见且实用的元素&#xff0c;能够在有限的空间内展示多个内容&#xff0c;吸引用户的注意力。下面将对上述代码中轮播图区域的实现方式进行详细介绍。 一、HTML 结构 <div class"carousel-c…

Java基础第21天-正则表达式

正则表达式是对字符串执行模式匹配的技术 如果想灵活的运用正则表达式&#xff0c;必须了解其中各种元字符的功能&#xff0c;元字符从功能上大致分为&#xff1a; 限定符选择匹配符分组组合和反向引用符特殊字符字符匹配符定位符 转义号\\:在我们使用正则表达式去检索某些特…

CSGO 盲盒开箱系统技术实现深度解析

一、系统架构设计 &#xff08;一&#xff09;前后端分离架构 采用前后端分离模式&#xff0c;后端专注业务逻辑处理与数据管理&#xff0c;前端负责用户交互界面呈现。后端通过 RESTful API 与前端进行数据交互&#xff0c;这种架构能有效提高开发效率&#xff0c;便于团队分…

JS通过GetCapabilities获取wms服务元数据信息并在SuperMap iClient3D for WebGL进行叠加显示

获取wms服务元数据信息并在三维webgl客户端进行叠加显示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><tit…

7N60-ASEMI无人机专用功率器件7N60

编辑&#xff1a;LL 7N60-ASEMI无人机专用功率器件7N60 型号&#xff1a;7N60 品牌&#xff1a;ASEMI 封装&#xff1a;TO-220F 最大漏源电流&#xff1a;7A 漏源击穿电压&#xff1a;600V 批号&#xff1a;最新 RDS&#xff08;ON&#xff09;Max&#xff1a;1.20Ω …

Pytorch图像数据转为Tensor张量

PyTorch的所有模型&#xff08;nn.Module&#xff09;都只接受Tensor格式的输入&#xff0c;所以我们在使用图像数据集时&#xff0c;必须将图像转换为Tensor格式。PyTorch提供了torchvision.transforms模块来处理图像数据集。torchvision.transforms模块提供了一些常用的图像预…

Java 加密与解密:从算法到应用的全面解析

Java 加密与解密&#xff1a;从算法到应用的全面解析 一、加密与解密技术概述 在当今数字化时代&#xff0c;数据安全至关重要。Java 加密与解密技术作为保障数据安全的关键手段&#xff0c;被广泛应用于各个领域。 加密是将明文数据通过特定算法转换为密文&#xff0c;使得…

Java基础系列-HashMap源码解析2-AVL树

文章目录 AVL树左旋右旋左旋右旋的4种情况LL 型RR 型LR 型RL 型 实际插入时怎么判断是那种类型&#xff1f;插入时注意事项删除节点 AVL树 为避免BST树退化成链表的极端情况&#xff0c; AVL 树应运而生。 平衡因子取值&#xff08;-1&#xff0c;0&#xff0c;1&#xff09;…

MySQL的日志--Redo Log【学习笔记】

MySQL的日志--Redo Log 知识来源&#xff1a; 《MySQL是怎样运行的》--- 小孩子4919 MySQL的事务四大特性之一就是持久性&#xff08;Durability&#xff09;。但是底层是如何实现的呢&#xff1f;这就需要我们的Redo Log&#xff08;重做日志&#xff09;闪亮登场了。它记录着…

【AI应用】免费代码仓构建定制版本的ComfyUI应用镜像

免费代码仓构建定制版本的ComfyUI应用镜像 1 创建代码仓1.1 注册登陆1.2 创建代码仓1.5 安装中文语言包1.4 拉取ComfyUI官方代码2 配置参数和预装插件2.1 保留插件和模型的版本控制2.2 克隆插件到代码仓2.2.1 下载插件2.2.2 把插件设置本仓库的子模块管理3 定制Docker镜像3.1 创…

​​Agentic AI——当AI学会主动思考与决策,世界将如何被重塑?

一、引言&#xff1a;2025&#xff0c;Agentic AI的元年 “如果ChatGPT是AI的‘聊天时代’&#xff0c;那么2025年将开启AI的‘行动时代’。”——Global X Insights[1] 随着Agentic AI&#xff08;自主决策型人工智能&#xff09;的崛起&#xff0c;AI系统正从被动应答的“工具…

Ollama API 应用指南

1. 基础信息 默认地址: http://localhost:11434/api数据格式: application/json支持方法: POST&#xff08;主要&#xff09;、GET&#xff08;部分接口&#xff09; 2. 模型管理 API (1) 列出本地模型 端点: GET /api/tags功能: 获取已下载的模型列表。示例:curl http://lo…

PNG透明免抠设计素材大全26000+

在当今的数字设计领域&#xff0c;寻找高质量且易于使用的素材是每个设计师的日常需求。今天&#xff0c;我们将为大家介绍一个超全面的PNG透明免抠设计素材大全&#xff0c;涵盖多种风格、主题和应用场景&#xff0c;无论是平面设计、网页设计还是多媒体制作&#xff0c;都能轻…

4.多表查询

SQL 多表查询&#xff1a;数据整合与分析的强大工具 文章目录 SQL 多表查询&#xff1a;数据整合与分析的强大工具一、 多表查询概述1.1 为什么需要多表查询1.2 多表查询的基本原理 二、 多表查询关系2.1 一对一关系&#xff08;One-to-One&#xff09;示例&#xff1a; 2.2 一…