进程间通信----管道

进程间通信详解 进程间通信详解(命名管道,匿名管道,共享内存) 阅读详情

进程间通信

了解管道之前,我们先要了解什么是进程间通信,为什么要进程间通信,进程间通信有什么好处,以及有哪些进程间通信方式!

背景:
1.在很多情况下,一些大型的程序使用的是多个进程相互配合完成任务
2.但是 进程具有独立性 ,无法方便的进行进程之间的沟通
3.为了使多个进程能容易的进行进程间的交流,引出进程间通信

作用:
1.数据交换
2.资源共享
3.相互通知
4.进程控制:某些进程需要被另一个进程完全控制

分类:
最 古老 的方式:
管道(pipe):匿名管道、命名管道
System V IPC标准:消息队列、共享内存、信号量
POSIX PIC标准:消息队列、共享内存、信号量、互斥量、条件变量、读写锁

管道

匿名管道:

1.实质:操作系统内核中的一块内存

2.操作方法:本着Linux中一切皆文件的原则,于是乎采用文件I\O的方式操作管道

父子进程实现单向通信代码:

#include<stdio.h>             
#include<unistd.h>            
#include<string.h>            
#include<errno.h>             
                              
int main(){                   
    int fd[2];                
    if(pipe(fd) < 0){         
        perror("pipe error"); 
        return -1;            
    }                         
	
    pid_t pid = fork();       
    if(pid < 0){              
        perror("fork error"); 
        return -1;            
    }                         
    if(pid == 0){             
        //child  close write  
        close(fd[1]);         
        char buf[1024] = {0}; 
		read(fd[0], buf, sizeof(buf) -1);
        printf("buf = %s\n",buf);        
        close(fd[0]);                    
    }                                    
    else{                                
        //father close read              
        sleep(2);                        
        close(fd[0]);                    
        char msg[] = "xixixhahahzhoudaxinbalalala"; 
        write(fd[1], msg, strlen(msg));             
        close(fd[1]); 
    }  
	return 0;	
}             

在这里插入图片描述

在这里插入图片描述
3.创建管道:
int pipe(int fd[2]);
返回值:成功0,失败错误码
参数: fd[2] 文件描述符数组
fd[0] 表示读(从管道中读取内容)
fd[1] 表示写(将内容写入管道当中)
通过操作该文件描述符数组操作管道(也就是管道所对应的内存)
失败原因:
管道资源(内存资源)不足
文件描述符达到上限

求一个进程可以申请的最大管道数代码:

#include<stdio.h>     
#include<unistd.h>    
#include<string.h>    
#include<sysexits.h>  
int main(){           
  int count = 0;      
  while(1){           
    usleep(40000);    
    int fd[2] = {0};  
    int ret = pipe(fd);
    if(ret < 0){       
      printf("i can pipe %d times\n", count);
      perror("pipe!!");                      
      break;                                 
    }                                        
    else{                                    
      printf("this is %d pipe\n",count);     
    }            
    count++;     
	}         
    return 0;    
}   

结果展示:
在这里插入图片描述
4.管道读写规则:
a.管道为空:read调用阻塞
b.管道已满:write调用阻塞
c.写端关闭:read返回0
d.读端关闭:write错误退出(产生SIGPIPE信号)
c.写入数据小于管道内存大小:写入操作保证具有原子性,反之则不保证具有原子性

注:原子性表示该操作不会被打断,直接完成。

命名管道:
1.实质:本体仍是内核中的一块内存
一种特殊类型的文件(文件系统可见)(该文件是管道入口)

2.操作方法:通过文件I\O操作管道

3.创建管道文件:
a.命令行创建
mkfifo filename 创建管道入口文件
b.代码创建
int mkfifo(const char filename, mode_t mode);
filename: 文件名称
mode: 文件权限

4.打开规则:
用open打开
读、写需要 同时打开,否则会阻塞
通过采用只读方式打开:得到读取管道内容的文件描述符
通过采用只写方式打开:得到将数据写入管道的文件描述符

匿名管道和命名管道的区别:
匿名管道只能用于具有亲属关系的管道之间,命名管道用于任意管道之间
匿名管道打开方式是pipe函数,命名管道打开方式是open

管道总结:
a. 匿名管道 只能用于具有亲属关系的进程之间通信 命名管道 用于任意进程之间
b.管道传输面向字节流,收发数据灵活,数据无规则发送,数据无边界
c.管道生命周期随进程,进程结束,管道释放
d.内核对管道操作进行同步和互斥
e.管道是半双工单向通信,数据只有一个流向
f.本质上都是操作系统内核中的一段内存

关于管道的内容到此结束,谢谢大家的支持!!
在这里插入图片描述

PyTorch 面试题及详细答案120题(54-70)-- 模型训练与评估 本文介绍了PyTorch模型训练的基本流程和核心概念。主要内容包括: 模型训练基本流程:通过代码示例展示了数据准备、模型定义、损失函数和优化器选择、训练循环(前向传播、反向传播、参数更新)的完整过程,并包含验证集评估的实现。 训练过程中的关键概念: Epoch:完整遍历一次训练集 Batch:将数据分成小批次 Iteration:一个Batch的参数更新过程 三者关系:1 Epoch = N/B Batch = N/B Iteration(N为样本数,B为batch_size) PyTorch数据加载机制: 阅读详情

相关推荐

立创EDA开源足轮机器人:基于STM32F407与ESP32的LQR自平衡与FOC驱动设计全解析

本文详细解析了基于立创EDA平台的开源足轮机器人项目。该项目采用STM32F407作为主控,ESP32负责无线通信,并应用LQR自平衡算法与FOC驱动技术,实现了机器人的稳定站立、移动转向及复杂地形适应能力。文章深入剖析了其硬件架构、软件设计及调试经验,为机器人运动控制学习提供了宝贵参考。

weixin_42608299的博客 232

进程间的通信方式(六种)

进程之间的通信 参考文章:https://blog.youkuaiyun.com/qq_34827674/article/details/107678226 前提知识:每个进程都有自己的用户空间,而内核空间是每个进程共享的。因此进程之间想要进行通信,就需要通过内核来实现。 管道: 管道是最简单,效率最差的一种通信方式。 管道本质上就是内核中的一个缓存,当进程创建一个管道后,Linux会返回两个文件描述符,一个是写入端的描述符,一个是输出端的描述符,可以通过这两个描述符往管道写入或者读取数据。 如果想要实现两个进程通过

OYMNCHR的博客 6万+

分享一个简单的迭代学习机器人双臂控制(MATLAB)

1 什么是迭代学习控制 迭代学习控制(iterative learning control,简称ILC)由Uchiyama于1978年首先提出,不过因为论文由日文撰写,影响不是很大。1984年,Arimoto等人用英文介绍了该方法。它是指不断重复一个同样轨迹的控制尝试,并以此修正控制律,以得到非常好的控制效果的控制方法。 迭代学习控制的特点是“在重复中学习”,通过反复的迭代修正,达到改善控制效果的目的。迭代学习控制的原理是根据系统前次运行所获得的输出误差信息,在控制过程中不断修正控制输入,随着迭代的进行,逐

weixin_45776027的博客 4483

【Unix编程】进程间通信(IPC)

进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括无名管道和命名管道)、消息队列、信号量、共享存储、Socket、Streams等。其中 Socket和Streams支持不同主机上的两个进程IPC。 一、管道 管道,通常指无名管道,是 UNIX 系统IPC最古老的形式。 ...

dbbaq24022的专栏 3013

AWR射频仿真基本操作(一)

这里只讲述一个基本的操作: 软件是AWR 14版本

钢丝 2万+

告别单一帧:在CFD-POST中完整加载Fluent瞬态计算结果的实战指南

本文详细介绍了在CFD-POST中完整加载Fluent瞬态计算结果的实战指南,解决工程师常见的只能看到最后一帧数据的问题。通过Fluent端的正确设置和CFD-POST端的完整加载技巧,帮助用户高效处理瞬态数据,提升后处理效率。文章还提供了常见问题排查、性能优化和高级后处理技巧,适用于Workbench环境下的流体流动分析。

weixin_29284657的博客 540

一文彻底搞懂进程间通信方式

每个进程各自有不同的用户地址空间,任何一个进程的全局变量在另一个进程中都看不到,所以进程之间要交换数据必须通过内核,在内核中开辟一块缓冲区,进程1把数据从用户空间拷到内核缓冲区,进程2再从内核缓冲区把数据读走,内核提供的这种机制称为进程间通信(IPC,InterProcess Communication)

永远在路上 5846

Cadence Sigrity PowerSI实战:从.brd到S参数提取的完整避坑指南

本文详细介绍了使用Cadence Sigrity PowerSI进行信号完整性分析的完整流程,从.brd文件预处理到S参数提取的关键技巧。通过实战案例和避坑指南,帮助工程师高效解决高速PCB设计中的信号质量问题,提升仿真精度和设计效率。

carrot的博客 694

操作系统——进程间通信

每个进程的用户地址空间都是独立的,一般而言是不能互相访问的,但内核空间是每个进程都共享的,所以进程之间要通信必须通过内核。​ 进程间通信目的一般有共享数据,数据传输,消息通知,进程控制等。以 Unix/Linux 为例,介绍几种重要的进程间通信方式:共享内存,管道,消息队列,信号量,信号​ 管道 如果你学过 Linux 命令,那你肯定很熟悉「|」这个竖线。 $ ps auxf | grep mysql 上面命令行里的「|」竖线就是一个管道,它的功能是将前一个命令(ps auxf)的输出,作为后一个命令(

zhouhengzhe的博客 9915

HSTS漏洞(缺少Strict-Transport-Security头)

HTTP严格传输安全性(HSTS)告诉浏览器只能使用HTTPS访问网站。检测到您的Web应用程序未实现HTTP严格传输安全性(HSTS),因为响应中缺少严格传输安全性标头。理想回复响应头因存在:Strict-Transport-Security: max-age=31536000信息。nginx添加响应头。

墨痕诉清风的博客 4409

OpenCv —— 检测车牌号(附完整源码)

OpenCv —— 检测车牌号

5601

进程间通信之管道

目录 前言 进程间通信的目的: 一.管道 1.1 匿名管道 1.1.1 匿名管道的使用场景 1.1.2 匿名管道实现通信的原理 1.1.3 怎么创建管道 1.1.4 怎么实现进程间通信 1.1.5 管道通信额四种情况 1.1.6 匿名管道的特征 1.2 命名管道 1.2.1 命名管道的原理 1.2.2 创...

weixin_57023347的博客 4301

Spring AI 实战:如何使用 MCP Server 搭建 MCP 天气查询服务

MCP(Model Context Protocol)是 Anthropic 提出的一种开放协议,它定义了AI 模型与外部世界交互的标准方式。通俗地说:大模型本身只拥有训练数据中的知识,它不知道今天的天气、无法查询你的数据库、不能调用你的内部 API。MCP 就是解决这个问题的"桥梁"——它让模型能够发现并使用外部工具(Tools),就像人用手去操作工具一样。角色职责对应依赖MCP Server暴露工具(Tool),供模型调用MCP Client连接 Server,让模型发现和使用工具本文我们先聚焦。

SmartSi 760

【Linux】进程间通信——管道

【Linux】进程间通信——管道

weixin_60478154的博客 3734

计算机控制技术及应用

《计算机控制技术及应用》通过总结作者的科研成果和吸收国内外的先进理论、方法和技术,以计算机控制系统的网络化、开放化、智能化和集成化发展趋势为主线索,主要介绍计算机控制系统的基本概念和计算机控制系统的典型形式,计算机控制系统的数学描述与基本分析方法,以及数字PID控制器、最少拍控制系统、达林算法、状态变量设计法等设计方法及其各种改进算法。重点突出计算机控制系统输入输出通道接口的设计方法和典型控制系统的设计案例与实现方法等。

SAP B1中文培訓教材_SDK

公司内部培训资料,对开发工具 ,DIAPI, UIAPI,Add-ON有详细解说

【Linux学习】进程间通信之 匿名管道 与 基于管道的进程池

进程间通信-1,进程间通信的目的,什么是管道,管道的原理,匿名管道,基于管道实现一个进程池。

2301_77509762的博客 4507

假人有限元模型

假人模型,车辆碰撞假人有限元模型,适合做乘员安全的研究者利用

【Linux】基于管道进行进程间通信

介绍进程间通信的概念,认识基于管道进行进程间通信,认识匿名管道和命名管道,基于管道简单实现进程池!在进程池中加入日志函数!

YoungMLet的博客 3334

lwip-2.0.3

lwip是瑞典计算机科学院(SICS)的Adam Dunkels 开发的一个小型开源的TCP/IP协议栈。实现的重点是在保持TCP协议主要功能的基础上减少对RAM 的占用。

进程间通信——管道

文章目录进程间通信介绍进程间通信目的进程间通信发展进程间通信分类管道什么是管道匿名管道实例代码用fork来共享管道原理站在文件描述符角度-深度理解管道站在内核角度-管道本质管道读写规则命令行中的 `|` 管道中,进程间是兄弟关系管道特点命名管道创建一个命名管道匿名管道与命名管道的区别命名管道的打开规则用命名管道实现server&client通信 进程间通信介绍 进程间通信目的 数据传输:一个进程需要将它的数据发送给另一个进程 资源共享:多个进程之间共享同样的资源。 通知事件:一个进程需要向另一个

aaaaaaaWoLan的博客 2874

十一、进程间通信——管道

进程间通信(IPC,InterProcess Communication)是指在不同进程之间传播或交换信息。IPC的方式通常有管道(包括匿名管道和命名管道)、消息队列、信号量、共享内存等。进程间通信的本质就是,让不同的进程看到同一份资源。由于各个运行进程之间具有独立性,这个独立性主要体现在数据层面,而代码逻辑层面可以私有也可以公有(例如父子进程),因此各个进程之间要实现通信是非常困难的。

weixin_54447296的博客 3357

Linux 进程间通信(管道)

进程间通信、匿名管道、命名管道 ...

2201_75663820的博客 2734

深入了解linux系统—— 进程间通信之管道

进程间通信与管道 进程间通信(IPC)是指在同一台计算机或不同计算机上的进程之间进行数据交换的技术。由于进程具有独立性,必须通过操作系统提供的共享资源实现通信。常见的IPC方式包括管道、共享内存、消息队列、信号/信号量以及套接字。 管道分为匿名管道和命名管道。匿名管道通过pipe()系统调用创建,适用于父子进程间的单向通信。其本质是一个由操作系统维护的无名文件,父子进程通过继承文件描述符访问同一资源。代码示例展示了子进程写入、父进程读取的通信过程,验证了管道的数据传输功能。 管道通信存在四种典型情况:单向读

LH__1314的博客 1627

Linux之进程间通信(管道)

什么是管道?1、管道是Unix中最古老的进程间通信的形式。2、我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”。管道只能进行单向通信,用来传输资源:数据。我们按下面的步骤来分析:1、首先,父进程分别以读和写的方式,打开了一个文件。2、然后,父进程fork创建了一个子进程,我们知道,子进程会继承父进程,指向同一个文件。3、我们规定,父进程对文件写入,子进程对文件读取。关闭父子进程各自不需要的功能。即:父进程关闭读的文件描述符,子进程关闭写的文件描述符。

zdlynj的博客 3006

【进程间通信】管道和命名管道

一个文件被打开了两次,因为他们打开的方式不一样,所以他们的标记为也一定不一样,它们在内存中的file结构体一定是存在两份的,但是文件的属性和操作集合都是一样的,所以文件属性和操作集合以及文件缓冲区是存在一份的,每个file结构体中会有一些基本的属性(读写位置等等),其次还会有一些指针,分别指向自己的属性和方法集合以及缓冲区。我们可以看到fd数字是一个文件描述符数组,所以Linux管道是复用了很多文件部分的代码的,所以在通信的时候很多还是文件的操作。管道是Unix中最古老的进程间通信的形式。

bushibrnxiaohaij的博客 1446

管道实现进程间通信之命名管道

管道通信之命名管道

xbhinsterest11的博客 1055

【进程间通信:管道】

Linux中管道如何构建?如何正常使用管道通信?以及使用管道通信时一些不容易被发现的Bug?

m0_68872612的博客 1315
上一篇: 动\静态库
下一篇: 进程间通信-----消息队列
Code_zx
博客等级 码龄9年 83粉丝 38原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

当前余额3.43元 前往充值 >
需支付:10.00元
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付元
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值