Linux应用开发-进程间通信-管道

文章目录

  • 管道
    • 特点
    • 匿名管道
      • 匿名管道的创建
      • 实现步骤
    • 有名管道
      • Linux系统命令实现
      • C语言实现
        • 写入
        • 读取

管道

管道中的数据只能单向流动,也就是半双工通信,如果想实现相互通信(全双工通信),我们需要创建两个管道。

向管道中写入数据时,linux将不保证写入的原子性,管道缓冲区一有空闲区域,写进程就会试 图向管道写入数据。如果读进程不读走管道缓冲区中的数据,那么写操作将一直阻塞。

注:只有在管道的读端存在时,向管道中写入数据才有意义。否则,向管道中写入数据的进程将收到 内核传来的SIFPIPE信号,应用程序可以处理该信号,也可以忽略(默认动作则是应用程序终止)。

特点

管道分为有名管道fifo和无名管道pipe

  1. 管道创建后是单向的,一端是写,一端是读

  2. 管道有大小,linux内核对每个管道的大小限制在4096字节

  3. 无名管道一般用在父子进程间通讯

  4. 有名管道一般用在进程与进程之间通讯

  5. 管道是阻塞的,读取管道过程中一直处于阻塞的状态

  6. 管道在被读取前,只能写入一次,多次写入是无效的

匿名管道

特点:

1、创建之后在文件系统不可见

2、半双工通信

3、固定的读端(0),写端(1)

4、只能用于具有亲缘关系的进程间的通信

匿名管道用完了就会被自动销毁。

例如linux系统的命令:

command1 | command2

以上这行代码就组成了一个管道,它的功能是将前一个命令(command1)的输出,作为后一个命令(command2)的输入。

匿名管道的创建

通过pipe 函数来创建匿名管道。

创建成功则返回 0,创建失败就返回 -1。

int pipe (int fd[2]);

该函数拥有一个存储空间为 2 的文件描述符数组:

  • fd[0] 指向管道的读端,fd[1] 指向管道的写端

  • fd[0] 的输出数据,是 fd[1] 的输入数据。

实现步骤

  1. 父进程创建两个匿名管道,管道 1(fd1[0]和 fd1[1])和管道 2(fd2[0] 和 fd2[1];因为管道的数据是单向流动的,所以要想实现数据双向通信,就需要两个管道,每个方向一个。

  2. 父进程 fork 出子进程,于是对于这两个匿名管道,子进程也分别有两个文件描述符指向匿名管道的读写两端;

  3. 父进程关闭管道 1 的读端 fd1[0] 和 管道 2 的写端 fd2[1],子进程关闭管道 1 的写端 fd1[1] 和 管道 2 的读端 fd2[0],这样,管道 1 只能用于父进程写、子进程读;管道 2 只能用于父进程读、子进程写。

管道是用环形队列实现的,数据从写端流入从读端流出,这就实现了父子进程之间的双向通信。

有名管道

匿名管道由于没有名字,只能用于父子进程间的通信。为了克服这个缺点,提出了有名管道,也称做 FIFO,因为数据是先进先出的传输方式。

所谓有名管道也就是提供一个路径名与之关联,这样,即使与创建有名管道的进程不存在亲缘关系的进程,只要可以访问该路径,就能够通过这个有名管道进行相互通信。

Linux系统命令实现

使用 Linux 命令 mkfifo 来创建有名管道

 mkfifo myPipe

往 myPipe 这个有名管道中写入数据:(数据未被读走时将阻塞)

echo "hello" > myPipe

执行另外一个命令来读取这个有名管道里的数据:

cat myPipe

C语言实现

步骤进程A进程B步骤
1.创建管道mkfifo
2.打开管道openopen1.打开管道
3.读写管道write/readwrite/read2.读写管道
4.关闭管道closeclose3.关闭管道
5.删除管道unlink
写入
#include <stdio.h>
#include <string.h>
#include <unistd.h>
#include <fcntl.h>
#include <sys/stat.h>#define FIFO_FILE "/tmp/fifo"int main(void){printf("创建管道...\n");if(mkfifo(FIFO_FILE,0666) == -1){perror("mkfifo");return -1;    }printf("打开管道...\n");int fd = open(FIFO_FILE,O_WRONLY);if(fd == -1){perror("open");return -1;}printf("发送数据...\n");for(;;){printf(">");char buf[1024];gets(buf);if(!strcmp(buf,"!"))break;if(write(fd,buf,(strlen(buf)+1)))  * sizeof(buf[0]) == -1){perror("write");return -1;        }                     }printf("关闭管道...\n");if(close(fd) == -1){perror("close");return -1;    }printf("删除管道...\n");if(unlink(FIFO_FILE) == -1){perror("unlink");return -1;    }printf("大功告成!\n");return 0;
}
读取
#include <stdio.h>
#include <unistd.h>
#include <fcntl.h>#define FIFO_FILE "/tmp/fifo"int main(void){printf("打开管道...\n");int fd = open (FIFO_FILE,O_RDONLY);if(fd == -1){perror("open");return -1;}printf("接收数据...\n");for(;;){char buf[1024];size_t rb = read(fd,buf,sizeof(buf));if(rb == -1){perror("read");return -1;}    if(!rb)break;printf("< %s\n",buf);}printf("关闭管道...\n");if(close(fd) == -1){perror("close");return -1;}printf("大功告成!\n");return 0;

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

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

相关文章

安装Selenium和WebDriver

幻灯片4&#xff1a;安装Selenium和WebDriver 安装Python环境 步骤一&#xff1a;下载Python安装包 访问Python官方网站&#xff08;https://www.python.org/downloads/&#xff09;&#xff0c;根据您的操作系统选择对应的Python安装包进行下载。请确保下载最新稳定版本的P…

边缘计算智能分析网关V4地面垃圾AI检测算法介绍及场景应用

在传统的卫生监管场景中&#xff0c;无法及时发现地面遗留的垃圾&#xff0c;通过人工巡逻的方式需要大量的人力、物力和时间&#xff0c;而且效率不高&#xff0c;并存在一定的滞后性&#xff0c;而采用地面垃圾AI检测算法则可以大大提高监管效率。 TSINGSEE青犀AI智能分析网…

macos、windows 思维导图 xmind pro

思维导图单机 Pro版&#xff1a; mac: XMind Pro 2024 for Mac v24.03.04745 直接拖动安装使用 windows: XMind思维导图 2024 V24.01.14362 安装教程&#xff1a;https://www.jb51.net/softs/876712.html https://www.jb51.net/softs/879963.html#downintro2

windows10安装Tensorflow-gpu 2.10.0

windows10安装Tensorflow-gpu 2.10.0 本文主要目的是 从0开始演示 在windows10 平台安装Tensorflow-gpu 2.10.0。 Tensorflow-gpu 2.10.0 之后的版本&#xff0c;不再支持这样的安装方式&#xff0c;如果有需要&#xff0c;请参考wsl安装ubuntu的方式&#xff0c;进行安装。 …

短视频矩阵源头====技术文档交付

短视频矩阵源头技术文档交付 搭建短视频矩阵系统源码需要以下步骤&#xff1a; 1. 确定系统需求和功能&#xff1a;明确系统需要支持哪些功能&#xff0c;例如短视频的上传、存储、播放、分享、评论、点赞等。 2. 选择合适的编程语言和框架&#xff1a;根据需求选择合适的编程…

2015NOIP普及组真题 2. 扫雷游戏

线上OJ&#xff1a; 一本通&#xff1a;http://ybt.ssoier.cn:8088/problem_show.php?pid1970 核心思想&#xff1a; 这是一道基础的 dfs模板题&#xff0c;只需要对每个点判断四周的8个点是否有雷即可&#xff0c;不需要在dfs中继续dfs。 step1. 如果是*&#xff0c;则直接…

力扣1144---递减元素使数组呈锯齿状(Java、Python、模拟)

目录 题目描述&#xff1a; 思路描述&#xff1a; 代码&#xff1a; Java&#xff1a; Python&#xff1a; 题目描述&#xff1a; 给你一个整数数组 nums&#xff0c;每次 操作 会从中选择一个元素并 将该元素的值减少 1。 如果符合下列情况之一&#xff0c;则数组 A 就是 …

存储人视角:人工智能AI + 大模型

原文来自于知乎存储专栏&#xff1a; 存储人视角&#xff1a;人工智能AI 大模型 前沿 我的角色 背景 AI 出场 效果 一个宠娃狂魔 娃喜爱并有奥特曼玩具 她的奥特曼玩具会跳舞了 娃对我的崇拜和爱又多了一分......amazing 杭州网商路艾弗森 球队需要制作LOGO 形象生动…

【办公软件word小技巧】如何一键提取word中的图片 几十张 几百张均可一键提取

在日常生活和工作中&#xff0c;我们经常会遇到需要从Word文档中提取图片的情况。无论是为了单独保存这些图片&#xff0c;还是为了在其他地方使用它们&#xff0c;一键提取Word中的图片都是一个非常实用的技能。提取Word文件中的图片并不是一件复杂的事情&#xff0c;只要掌握…

照片jpg格式小于50kb怎么弄?jpg压缩到指定大小

我们经常需要处理大量的图片&#xff0c;特别是在分享到社交媒体时&#xff0c;然而&#xff0c;图片文件的大小常常成为困扰我们的问题&#xff0c;尤其是当我们的设备存储空间有限时。有些平台甚至会需要将图片压缩到50kb大小&#xff0c;那么&#xff0c;如何有效地压缩图片…

力扣日记4.18-【动态规划篇】416. 分割等和子集

力扣日记&#xff1a;【动态规划篇】416. 分割等和子集 日期&#xff1a;2024.4.18 参考&#xff1a;代码随想录、力扣 416. 分割等和子集 题目描述 难度&#xff1a;中等 给你一个 只包含正整数 的 非空 数组 nums 。请你判断是否可以将这个数组分割成两个子集&#xff0c;使…

WAF攻防-权限控制代码免杀异或运算变量覆盖混淆加密传参

知识点 1、脚本后门基础&原理 2、脚本后门查杀绕过机制 3、权限维持-覆盖&传参&加密&异或等 章节点&#xff1a; WAF绕过主要集中在信息收集&#xff0c;漏洞发现&#xff0c;漏洞利用&#xff0c;权限控制四个阶段。 代码表面层免杀-ASP&PHP&JSP&a…

电商数据接口开发|淘宝商品接口|天猫商品接口|京东商品接口|拼多多商品接口|API接口申请指南

电商数据接口开发涉及到多个电商平台&#xff0c;包括淘宝、天猫、京东和拼多多等。这些平台都提供了丰富的API接口&#xff0c;以便开发者能够获取商品信息、订单数据等&#xff0c;从而构建出各种电商应用和服务。 1.请求方式&#xff1a;HTTP POST GET &#xff08;复制薇&…

Python经典游戏:乒乓球对战(单人+双人模式)

Python108款&#xff0c;小游戏集合&#xff0c;总有一个是你想要的 中国象棋 像素鸟 五子棋 24点小游戏 贪吃蛇 扫雷 俄罗斯方块 魂斗罗 消消乐 坦克大战 外星人入侵 汤姆猫 斗地主 乒乓球 推箱子 植物大战僵尸 围棋 超级玛丽 飞机大战 迷宫 滑雪 吃豆人…等等 &#xff0…

【202】Java8从数据库表中读取树形结构示例

数据库准备工作 数据库表结构如下&#xff1a; CREATE TABLE t_menu (c_id varchar(80) NOT NULL COMMENT 主键,c_name varchar(15) NOT NULL COMMENT 菜单名称,c_parent_id varchar(80) NOT NULL COMMENT 父级菜单id,c_icon text COMMENT 图标,c_type tinyint(1) NOT NULL C…

基于springboot实现信息化在线教学平台设计【项目源码+论文说明】计算机毕业设计

基于springboot实现信息化在线教学平台设计演示 摘要 随着信息技术在管理上越来越深入而广泛的应用&#xff0c;管理信息系统的实施在技术上已逐步成熟。本文介绍了信息化在线教学平台的开发全过程。通过分析信息化在线教学平台管理的不足&#xff0c;创建了一个计算机管理信息…

【OpenGL开发】PyQt在关闭应用程序时没有运行析构函数的问题

PyQt在关闭应用程序时没有运行析构函数的问题 目录 一、说明二、python的析构函数三、通用版QT5 存在一些问题四、python版PyQt5 存在一些问题五、OpenGL的析构问题5.1 OpenGL很脆弱,这不是危言耸听5.2 以上OpenGL问题解决方法六、一些保留意见一、说明 应用QT做程序界面,在…

我的编程与创作历程:512天从C语言到Linux

我的编程与创作历程&#xff1a;从C语言到Linux 在过去的512天里&#xff0c;我从一个对编程充满好奇的学生成长为了一个拥有59篇博客和1728名粉丝&#xff08;虽然可能大部分都不是活的&#xff09;的技术博客作者。我的成长之路从C语言开始&#xff0c;经过数据结构的深入学…

电视盒子哪个牌子好?博主总结网络电视盒子推荐

电视盒子是我们使用最多的产品&#xff0c;追剧、游戏、上网课都离不开电视盒子&#xff0c;但很多朋友不知道电视盒子哪个牌子好&#xff0c;我这周共计测评了18款不同品牌的电视盒子&#xff0c;今天整理了五款网络电视盒子推荐&#xff0c;想买电视盒子可以看看下面这些。 第…

vscode 配置go环境

https://www.zhihu.com/question/486786946/answer/2723663432 注意一定要安装最新版,否则不容易debug //main.go package main //说明hello.go这个文件在main这个包中import "fmt" //导入内置包&#xff0c;可以使用其中函数等func main() {fmt.Println("Hello…