Linux——进程间通信——管道(文件)通信

news/2024/5/1 15:28:42/文章来源:https://blog.csdn.net/x20020402/article/details/127623314

目录

前言

一、有名管道

1、用法

2、管道分类

3、有名管道的创建

4、思考:如何进程a要将键盘获取的数据传递给另一个进程b?

 5、有名管道实现进程间通信

二、无名管道

1、无名管道的创建

2、管道操作分为以下步骤

3、无名管道实现进程间通信

前言

进程间通信方法:

(1)管道

(2)信号量

(3)共享内存

(4)消息队列

(5)套接字

一、有名管道

1、用法

  • | 命令
  • 举例:ps -ef|grep "sleep"

两个进程通信:比如a,b进程,a想管道中写入数据,b读取数据;

2、管道分类

(1)有名管道

(2)无名管道

区别:有名管道可以在任意进程间通信;无名管道主要在父子进程间通信(重点)

3、有名管道的创建

①命令:mkfifo  (属于系统调用)

②打开管道:open()

③读数据:read()

④写数据:write()

⑤关闭管道:close()

4、思考:如何进程a要将键盘获取的数据传递给另一个进程b?

(不能用文件传递),效率太慢。

创建管道之后,它会在内存上分配一块空间,表面上卡把数据写入管道中了,实际上是吧数据写入内存中了。另外一个程序是从内存中读取数据的,所以效率是比较高的。

管道文件的大小永远为0。如下图所示:

 5、有名管道实现进程间通信

(1)参考代码:

//a.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<fcntl.h>int main()
{int fd=open("fifi",O_WRONLY);assert(fd!=-1);printf("fd=%d\n",fd);write(fd,"hello",5);close(fd);}//加入循环后:
//c.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<fcntl.h>int main()
{int fd=open("fifi",O_WRONLY);assert(fd!=-1);// printf("fd=%d\n",fd);while(1){printf("input:\n");char buff[128]={0};fgets(buff,128,stdin);if(strncmp(buff,"end",3)==0){break;}   write(fd,buff,strlen(buff));}close(fd);}
//b.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<fcntl.h>int main()
{int fd=open("./fifi",O_RDONLY);assert(fd!=-1);printf("fd=%d\n",fd);char buff[128]={0};read(fd,buff,127);printf("read:%s\n",buff);close(fd);}//加入循环后:
//d.c
#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<fcntl.h>int main()
{int fd=open("./fifi",O_RDONLY);assert(fd!=-1);printf("fd=%d\n",fd);while(1){char buff[128]={0};if(read(fd,buff,127)==0){break;}printf("read:%s\n",buff);}close(fd);}

 (2)管道的特点

①管道必须读、写进程同时open,否则会阻塞;

  • 阻塞的情况:(只有写进程open或只有读进程open)

 

 正确的通信:读写进程同时open(打开两个窗口)

②如果管道中没有数据,那么read就会阻塞。

③管道的写端关闭,读read返回值为0;

④管道打开的时候只读和只写方式,读写方式是未定义的。

⑤管道是半双工的(某一时刻只能选择一个方向)(重点)

    通信方式:单工、半双工、全双工。

⑥无论有名还是无名, 写入管道的数据都在内存中。(重点)

 ⑧管道的读端关闭,写会产生异常(发送信号SIGPIPE)(可以改变信号的响应方式验证一下)。

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>
#include<fcntl.h>
#include<signal.h>//发送信号
void fun(int sig)
{printf("sig=%d\n",sig);   
}int main()
{signal(SIGPIPE,fun);int fd=open("fifi",O_WRONLY);assert(fd!=-1);// printf("fd=%d\n",fd);while(1){printf("input:\n");char buff[128]={0};fgets(buff,128,stdin);if(strncmp(buff,"end",3)==0){break;}   write(fd,buff,strlen(buff));}close(fd);}

二、无名管道

使用pipe创建无名管道,**只能进行父子间的通信;

pipe是一个系统调用

1、无名管道的创建

int pipe(int fds[2]);
//pipe()成功返回0,失败返回-1;
//fds[0]是管道读端的描述符
//fds[1]是管道写端的描述符

2、管道操作分为以下步骤

(1)父进程调用pipe函数开辟管道,得到两个文件描述符指向管道的两端;

(2)父进程用fork创建子进程,那么子进程也有两个文件描述符指向同一管道;

(3)父进程关闭管道文件读端,子进程关闭写端。父进程可以往管道里写数据,子进程可以从管道中读数据,这样就在父子进程之间建立管道,实现进程间通信。

3、无名管道实现进程间通信

参考代码:

#include<stdio.h>
#include<stdlib.h>
#include<unistd.h>
#include<string.h>
#include<assert.h>int main()
{int fd[2];assert(pipe(fd)!=-1);pid_t pid=fork();//先open,再fork,父子进程共享打开的文件描述符assert(pid!=-1);if(pid==0){close(fd[1]);char buff[128]={0};read(fd[0],buff,127);printf("child read:%s\n",buff);close(fd[0]);}else{close(fd[0]);write(fd[1],"hello",5);close(fd[1]);}exit(0);
}

如有错误,敬请指正。

您的收藏与点赞都是对我最大的鼓励和支持!

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

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

相关文章

string类详解

文章目录1:构造string类1.1:方法1.2:测试2:size和length2.1:用途2.2:测试3:capacity3.1:用途3.2:测试4:clear4.1:用途4.2:测试5:empty5.1:用途5.2:测试6:reserve6.1:用途6.2:测试7:resize7.1:用途7.2:测试8:string的三种遍历8.1:方法一 for循环和[]重载8.2:方法二 迭代器8.2.1:…

基于CNTK/C#实现逻辑回归【附源码】

文章目录前言一、VS2022CNTK环境搭建二、逻辑回归代码构建1.逻辑回归构建2.训练数据的生成3.模型训练三、效果展示前言 本文基于CNTK实现逻辑回归二分类&#xff0c;并以之前的不同&#xff0c;本次使用C#实现&#xff0c;不适用python&#xff0c;python版的CNTK比较简单&…

Java多线程-ThreadPool线程池(三)

开完一趟车完整的过程是启动、行驶和停车,但老司机都知道,真正费油的不是行驶,而是长时间的怠速、频繁地踩刹车等动作。因为在速度切换的过程中,发送机要多做一些工作,当然就要多费一些油。 而一个Java线程完整的生命周期就包括:1、T1:创建(启动) 2、T2:运行(行驶)…

苹果IOS应用上架AppStore的流程与教程

快打包生成的苹果APP上架到苹果官方appstore商店的详细流程与教程第一步:创建app发布证书以及配置文件1、打开苹果开发者中心网站:https://developer.apple.com,点击右上角 Account 使用开发者账号登录,如下图所示:​编辑切换为居中添加图片注释,不超过 140 字(可选)2、…

基于IoT全链路实时质量-魔洛哥

简介: 通过基于IoT的全链路实时质量,业务使用狄仁杰进行全链路埋点后,可一键接入魔洛哥平台,实现终端问题的实时感知和链路分析,以及智能终端系统业务场景的全链路实时质量。整体方案接入成本低(分钟级别接入),可实现全链路的实时质量分析,以及精准的终端预警能力。帮…

JavaScript 51 JavaScript 严格模式

JavaScript 文章目录JavaScript51 JavaScript 严格模式51.1 "use strict" 指令51.2 声明严格模式51.3 "use strict"; 语法51.4 为什么使用严格模式&#xff1f;51.5 严格模式中不允许的事项51.6 对未来的保障51.7 警告51 JavaScript 严格模式 “use stric…

IDEA下载与安装,保姆级教程

这里写自定义目录标题1.搜索idea2.选择官方网站3.官网进入下载页面4.版本选择问题5. Ultimate和Community对比6.下载7.安装1.搜索idea 2.选择官方网站 以前idea的官网后面有官网俩字&#xff0c;现在没有了&#xff0c;你可以看他的具体网址&#xff0c;因为idea是Jetbrains公…

猿创征文|计算机学生必须掌握的学习工具

&#x1f353;个人主页&#xff1a;bit.. &#x1f352;系列专栏&#xff1a;Linux(Ubuntu)入门必看 C语言刷题 数据结构与算法 目录 一.c/c使用的软件 二.GitHub和gitee的使用 三.学会如何去调试代码 修改bug 四.学习Linux上面的基本操作 五.java使用的软件 六.p…

【案例源码公开】国产AD+全志T3开发案例,为能源电力行业排忧解难!8/16通道

前 言 本文主要介绍基于全志科技T3(ARM Cortex-A7)国产处理器的8/16通道AD采集开发案例,使用核芯互联CL1606/CL1616国产AD芯片,亦适用于ADI AD7606/AD7616。CL1606/CL1616与AD7606/AD7616软硬件兼容。 备注: (1)创龙科技TL7606I模块使用AD芯片为核芯互联CL1606或ADI AD…

Softing连接解决方案——将FANUC数控机床数据集成到西门子工业边缘

2022年10月10日&#xff08;哈尔&#xff09;&#xff0c;Softing发布了edgePlug FANUC CNC&#xff0c;其丰富了edgePlug产品系列。该产品系列基于Linux的Docker容器应用并为西门子工业边缘应用提供了控制器数据。 &#xff08;Softing的edgePlug Docker容器产品为西门子工业边…

《Python+Kivy(App开发)从入门到实践》自学笔记:简单UX部件——Label标签

章节知识点总揽 4.2 Label标签 在Kivy中&#xff0c;Label小部件用于呈现文本&#xff0c;它仅支持ASCII和Unicode编码的字符串&#xff08;不支持中文&#xff09;&#xff0c;在Label中&#xff0c;可以设置文本内容、字体、大小、颜色、对齐方式、换行、引用以及标记文字等…

【PCBA方案设计】快速体温计方案

一、电子体温计方案介绍 电子体温计由温度传感器&#xff0c;液晶显示器&#xff0c;纽扣电池&#xff0c;专用集成电路及其他电子元器件组成。能快速准确地测量人体体温&#xff0c;与传统的水银玻璃体温计相比&#xff0c;具有读数方便&#xff0c;测量时间短&#xff0c;测量…

DM数据库安装、登录和创建用户

DM数据库安装、登录和创建用户子安拉取镜像 wget -O dm8_docker.tar -c https://download.dameng.com/eco/dm8/dm8_20220822_rev166351_x86_rh6_64_ctm.tar docker load -i dm8_docker.tar docker images编写docker-compose.yml version: 3 services:dm8:image: dm8_single:v8.…

操作系统(九)进程通信

文章目录1 IPC1.1通信操作1.2通信链路的实现1.3通信分类1.3.1直接通信与间接通信直接通信间接通信1.3.2消息传递的特征1.4缓冲问题1.4.1容量问题2信号&#xff08;signal&#xff09;2.1原理2.2接收信号后处理方式2.3不足2.4实现3管道3.14消息队列5共享内存6socket机制1 IPC i…

为什么选择高防DNS云解析?

DNS&#xff08;Domain Name System&#xff0c;域名服务器&#xff09;是互联网的一项核心服务&#xff0c;是域名与对应IP地址进行转换的系统&#xff0c;可将易于记忆的域名转换为可由服务器识别的用于互连通信的数字IP地址。随着大数据时代的到来&#xff0c;传统DNS所存在…

C语言~指针变量

给自己找的基础啊~~ 给自己学 多谢大佬指点 别的勿扰 指针变量的基本操作基本操作 int a,*iptr,*jptr,*kptr; iptr &a; jptr iptr; *jptr 100; kptr NULL; 己址和己空间 指针变量也是一个变量&#xff0c;对应一块内存空间&#xff0c;对应一个内存地址…

DJ8-2 主存储器的组织

如何由存储芯片到存储器&#xff1f; 确定设计容量&#xff1a;多大设计容量 芯片的选用&#xff1a;多大容量&#xff0c;位数&#xff0c;多少片&#xff0c;如何分组 地址分配&#xff1a;将CPU提供的全部地址空间的哪些地址空间分配给所设计的存储器&#xff0c;确定各芯…

docker搭建zabbix服务

docker搭建zabbix服务zabbix简介1、本次安装zabbix的镜像版本2、zabbix组件2.1 创建子网2.2 MySQL容器2.3 zabbix-server-mysql容器2.4 zabbix-web-nginx-mysql容器2.5 zabbix-agent2容器2.6 zabbix-snmptraps容器3、zabbix访问3.1 中文字体修改zabbix简介 zabbix&#xff08;…

esp32通过micropython-->MQTT--上传至腾讯云,实时显示温湿度数据保姆级教程(上)

esp32通过micropython-->MQTT--上传至腾讯云&#xff0c;实时显示温湿度数据保姆级教程&#xff08;上&#xff09;1.注册登录和创建产品&#xff1a;1.1注册账号/登录账号&#xff1a;1.2创建产品&#xff1a;1.注册登录和创建产品&#xff1a; 1.1注册账号/登录账号&…

销售人员应关注的 5 个指标

在上一篇博客 不想写代码&#xff0c;想要灵活性&#xff1f;这个指标平台全都有 中&#xff0c;我们提到了指标的分类一般分为基础指标、衍生指标和复合指标。其中基础指标可用于量化统计事务属性&#xff0c;如总金额等。而对于销售人员来说&#xff0c;最常接触/使用的指标是…