Linux——进程间通信管道

在这里插入图片描述


📘北尘_:个人主页

🌎个人专栏:《Linux操作系统》《经典算法试题 》《C++》 《数据结构与算法》

☀️走在路上,不忘来时的初心

文章目录

  • 一、进程间通信
    • 1、进程间通信的目的
    • 2、进程间通信发展
    • 3、进程间通信分类
  • 二、管道
    • 1、什么是管道?
    • 2、用fork来共享管道原理
    • 3、站在文件描述符角度-深度理解管道
    • 4、管道的五个特点
    • 5、管道的四种场景
    • 6、代码示例


一、进程间通信

1、进程间通信的目的

  1. 数据传输:一个进程需要把他的数据传给另外一个进程。
  2. 资源共享:多个进程之间共享同样的资源。
  3. 通知事件:一个进程需要向另一个或一组进程发送消息,通知它(它们)发生了某种事件(如进程终止时要通知父进程)。

2、进程间通信发展

  1. 管道(本质上就是文件)
  2. System V进程间通信
  3. POSIX进程间通信

3、进程间通信分类

管道

  1. 匿名管道pipe
  2. 命名管道

System V IPC

  1. System V 消息队列
  2. System V 共享内存
  3. System V 信号量

POSIX IPC

  1. 消息列队
  2. 共享内存
  3. 信号量
  4. 互斥量
  5. 条件变量
  6. 读写锁

二、管道

1、什么是管道?

管道是Unix中最古老的进程间通信的形式。
我们把从一个进程连接到另一个进程的一个数据流称为一个“管道”
在这里插入图片描述

2、用fork来共享管道原理

在这里插入图片描述

3、站在文件描述符角度-深度理解管道

在这里插入图片描述
在这里插入图片描述

4、管道的五个特点

  1. 具有血缘关系才可以进程间通信。
  2. 管道只能进程单向通信。
  3. 父子协同 同步和互斥。
  4. 面向字节流。
  5. 管道是基于文件的,而文件的声明周期是随进程的。

5、管道的四种场景

  1. 读写端正常,如果管道为空,写端会堵塞
  2. 读写端正常,如果管道已满,读端会堵塞
  3. 读端正常读,写端关闭,读端就会读到0,表示读到文件结尾,不会堵塞
  4. 写端正常读,读端关闭,则write操作会产生信号SIGPIPE,进而可能导致write进程退出。

6、代码示例

#include<iostream>
#include<sys/types.h>
#include<cstdio>
#include<unistd.h>
#include<sys/wait.h>
#include<string>
#include<cstring>
using namespace std;
#define NUM 1024
#define N 2void Writer(int fd)
{char buffer[NUM];string s="hello l am child";pid_t id=getpid();int number=0;while(1){sleep(1);buffer[0]=0;snprintf(buffer,sizeof(buffer),"%s-%d-%d",s.c_str(),id,number++);write(fd,buffer,strlen(buffer));}
}
void Reader(int id)
{char buffer[NUM];while(1){buffer[0]=0;ssize_t n=read(id,buffer,sizeof(buffer));if(n>0){buffer[n]='\0';cout<<buffer<<endl;}}
}
int main()
{int pipefd[N]={0};int n=pipe(pipefd);if(n<0) return 1;pid_t id=fork();if(id<0) return 2;if(id==0){//子进程close(pipefd[0]);Writer(pipefd[1]);exit(0);}//父进程close(pipefd[1]);Reader(pipefd[0]);pid_t rid=waitpid(id,nullptr,0);return 0;
}

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

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

相关文章

tcp 协议详解

什么是 TCP 协议 TCP全称为 “传输控制协议(Transmission Control Protocol”). 人如其名, 要对数据的传输进行一个详细的控制。TCP 是一个传输层的协议。 如下图&#xff1a; 我们接下来在讲解 TCP/IP 协议栈的下三层时都会先解决这两个问题&#xff1a; 报头与有效载荷如何…

【Linux】线程控制{fork() / vfork / clone/pthread_join()/pthread_cancel()}

文章目录 1.fork() / vfork / clone2.线程等待2.1pthread_join()2.2pthread_tryjoin_np() 3.pthread_exit()4.pthread_cancel()5.一些线程相关的问题6.pthread_detach()7.pthread_self()8.认识线程标识符&#xff1a;pthread_self()获取线程标识符9.POSIX线程库 1.fork() / vfo…

【CVPR2024】CricaVPR

【CVPR2024】CricaVPR: Cross-image Correlation-aware Representation Learning for Visual Place Recognition 这个论文提出了一种具有跨图像相关性的鲁棒全局表示方法用于视觉位置识别&#xff08;VPR&#xff0c;Visual Place Recognition &#xff09;任务&#xff0c;命…

MySQL学习笔记------SQL(1)

关系型数据库&#xff08;RDBMS&#xff09; 建立在关系模型基础上&#xff0c;由多张相互连接的二维表组成的数据库 特点&#xff1a;使用表储存数据&#xff0c;格式统一&#xff0c;便于维护 使用SQL语言操作&#xff0c;标准统一&#xff0c;使用方便 SQL通用语法 SQL…

Java 开篇之 JDK 下载、安装、配置、卸载、运行及乱码处理

JDK 安装和配置 本文内容简介&#xff1a; JDK 简介JDK 正确卸载方式JDK 下载和安装环境变量配置开发过程运行结果及乱码解决 JDK 简介 JDK&#xff08;Java Development Kit&#xff09;是 Java 语言的软件开发工具包&#xff0c;它是 Sun Microsystems&#xff08;现已被 Ora…

【研发日记】C/C++开发避坑秘籍(一)——CAN接收Buffer溢出Bug

文章目录 背景介绍 问题描述 分析排查 解决方案 总结归纳 背景介绍 在一个嵌入式软件项目中&#xff0c;有一段使用C语言写的嵌入式代码&#xff0c;功能是把CAN总线上的几帧报文接收进来&#xff0c;并解析出数据。示例如下&#xff1a; 乍一看感觉挺简单&#xff0c;想着…

Python编程异步爬虫——协程的基本原理

Python编程之异步爬虫 协程的基本原理 要实现异步机制的爬虫&#xff0c;自然和协程脱不了关系。 案例引入 先看一个案例网站&#xff0c;地址为https://www.httpbin.org/delay/5&#xff0c;访问这个链接需要先等5秒钟才能得到结果&#xff0c;这是因为服务器强制等待5秒时…

cookie、session和token的区别

引言 在当今的互联网时代&#xff0c;Web 应用程序的安全性和用户体验至关重要。身份验证和状态管理是构建安全、可靠的 Web 应用的核心部分。cookie、session、token都是常用的身份验证和状态管理机制。 Cookie 什么是 Cookie&#xff1f; Cookie 是存储在用户浏览器中的小…

【算法】回溯与深搜

方法论 1.构建决策树 2.设计代码&#xff1a;全局变量、dfs函数 3.剪枝&#xff0c;回溯 全排列 给定一个不含重复数字的整数数组 nums &#xff0c;返回其 所有可能的全排列 。可以 按任意顺序 返回答案。 示例 1&#xff1a; 输入&#xff1a;nums [1,2,3] 输出&#xff…

微软Microsoft Surface Go 2

1个小玩具 Microsoft Surface Go 2的评测结果出炉&#xff01;它是目前最好的中端Windows 二合一笔记本平板。 外形简洁小巧&#xff0c;工作娱乐两不误。 它有多个版本。 我们测试的是配备8GB Ram和128GB SSD的Pentium 4425Y处理器&#xff08;第8代&#xff09;的型号。 S…

elementary OS7 Ubuntu 22.04中硬盘挂载报错

elementary OS7 Ubuntu 22.04中硬盘挂载报错 背景目标思路解决方法 背景 上周末安装elementaryos7的过程中将windows10的引导文件搞丢了&#xff0c;这两天准备修复一下&#xff0c;保险期间将固态硬盘上的文件备份到移动硬盘上&#xff0c;备份过程中出现报错的问题&#xff…

机器学习的常用方法

引言&#xff1a; 机器学习&#xff08;Machine Learning&#xff0c;ML&#xff09;是一种以计算机程序为基础&#xff0c;在不需要明确编程的情况下&#xff0c;对数据进行分析和处理的人工智能技术。与传统的计算机编程相比&#xff0c;机器学习的区别在于它通过数据建立模…

对适配器模式的理解

目录 一、适配器模式是什么&#xff1f;二、示例【[来源](https://refactoringguru.cn/design-patterns/adapter)】1 第三方依赖 &#xff08;接口A 数据A&#xff09;2 客户端3 方钉转圆钉的适配器&#xff08;数据B&#xff09; 三、适配器&#xff08;xxxAdapter&#xff0…

超越肉眼:深入计算机视觉的奇妙之旅

揭秘计算机视觉的奥秘&#xff1a;从基础到前沿的探索之旅 引言&#xff1a;一、计算机视觉的基础1. 图像处理基础2. 特征提取与描述3. 基本模式识别 二、机器学习在计算机视觉中的应用1. 深度学习革命2. 迁移学习与多任务学习3. 强化学习与主动学习4. 无监督学习和自监督学习 …

C++ [COCI2017-2018#6] Davor

文章目录 一、题目描述[COCI2017-2018#6] Davor题面翻译题目描述输入格式输出格式样例 #1样例输入 #1样例输出 #1 样例 #2样例输入 #2样例输出 #2 样例 #3样例输入 #3样例输出 #3 二、参考代码 一、题目描述 [COCI2017-2018#6] Davor 题面翻译 在征服南极之后&#xff0c;Da…

Kafka系列之:Kafka Connect REST API

Kafka系列之:Kafka Connect REST API 由于 Kafka Connect 旨在作为服务运行,因此它还提供了用于管理连接器的 REST API。此 REST API 可在独立模式和分布式模式下使用。可以使用侦听器配置选项来配置 REST API 服务器。该字段应包含以下格式的侦听器列表: protocol://host:p…

Axure RP 9 for Mac中文激活版:原型设计工具

Axure RP 9 for Mac是一款值得设计师信赖的原型设计工具。它以其卓越的性能和稳定的运行赢得了广大用户的赞誉。 软件下载&#xff1a;Axure RP 9 for Mac中文激活版下载 在Axure RP 9中&#xff0c;您可以尽情发挥自己的设计才华&#xff0c;创造出独一无二的原型作品。无论是…

电子电器架构 —— 诊断数据DTC起始篇(下)

电子电器架构 —— 诊断数据DTC起始篇(下) 我是穿拖鞋的汉子,魔都中坚持长期主义的汽车电子工程师(Wechat:gongkenan2013)。 老规矩,分享一段喜欢的文字,避免自己成为高知识低文化的工程师: 本就是小人物,输了就是输了,不要在意别人怎么看自己。江湖一碗茶,喝完再…

系统架构设计-构建系统应用

1. 系统架构目标与设计原则 在设计系统架构时&#xff0c;我们的目标是确保系统具有以下特点&#xff1a; 可靠性&#xff1a;系统能够持续稳定运行&#xff0c;保证业务可用性。可伸缩性&#xff1a;系统能够根据负载变化自动扩展或收缩&#xff0c;以应对不同的流量需求。容…

STM32通过串口发送指令控制LED灯亮灭OLED并显示命令

先来看看程序运行的结果吧&#xff1a; 接下来就不说废话了&#xff0c;自己看源代码吧&#xff01;每一行我都做了注释&#xff1a; 首先是主函数main.c文件&#xff1a; #include "stm32f10x.h" // Device header #include "OLED.h" …