进程通讯之有名管道

进程间通信之有名管道(fifo) 完整代码 进程间通信之有名管道(fifo) 注意: 如果只打开有名管道的一端 则系统将暂时阻塞打开进程 直到有另一个进程打开该管道的另一端 当前进程才会继续执行 七种进程间通信方式: 一 无名管道( pipe ) 二 有名管道( fifo ) 三 共享内存 shared memory 四 信号 sinal 五 消息队列 message queue ) 六 信号量 semophore 七 套接字 socket 以上七种进程间通信的完整代码 皆可以在我的资源列表中获取下载: 资源列表:http: download youkuaiyun.com user qiulanzhu">进程间通信之有名管道(fifo) 注意: 如果只打开有名管道的一端 则系统将暂时阻塞打开进程 直到有另一个进程打开该管道的另一端 当前进程才会继续执行 七种进程间通信方式: 一 无名管道( pipe ) 二 有名管道( f [更多] 立即下载

进程通讯之有名管道

一、前言:
我们前面博客讲过,父子进程之间,对于文件操作的文件操作符是共享的,而对于进程的全局数据,堆区数据,栈区数据是不共享的,那么进程之间到底是怎么进行信息的传递的呢,具体的实现,以及传递的过程是怎么完成的呢,前面我们讲过信号在进程之间的使用,那也是一种进程之间信息的传递。

二、进程的通讯方式---有名管道
进程的通讯方式主要有信号,管道,信号量,消息队列,共享内存,socket(套接字);
而我们今天说的是管道中的有名管道,那么什么是管道呢,在前面的文件系统中说过一个文件的分类中有一个文件类叫管道文件,而我们这边说的管道就是管道文件,为啥呢?Linux下一切皆文件。
接着我们看它的定义:
管道:在内存上开辟一块空间,用文件描述符指向这块空间(也就是以操作文件的方式来使用这块空间)。
有名管道:在文件系统中存在一个文件标识(文件名),但是这管道文件不占据磁盘空间,而是在内存上,需要传递的数据缓存在内存区域上。
管道文件与普通文件的区别:
存储:
管道文件---------------内存
普通文件---------------磁盘

有名管道是一种特殊的管道:称为FIFO(First In First Out,先进先出),类似于我们在数据结构中学的‘队列’,它也叫命名管道,用于没有联系的进程之间的通信。
 

接着我们看两个无关的进程之间数据传输的图示:

上面是两个进程之间进行信息的传递,利用管道文件,而管道文件所在为内存区域,当进程A对管道文件进行写操作,进程B 就会从管道文件读取进程A写在管道文件中的数据,从而实现两个进程之间数据的传递。

创建管道的命令:
shell下: mkfifo  +  所要创建的管道文件名
函数中创建管道文件的函数是:
int mkfifo(const char*pathname, mode_t mode);

管道文件的操作:
打开:int open(char *path,int flag,);
读:int read(int fd, void *buff, size_t size);
写: int write(int fd, void *buff, size_t size);

关闭:int close(int fd);

对于普通文件操作时打开文件,如果这个文件不存在,则创建,但是对于管道文件则不行,则需要调用上面的mkfifo()函数,创建一个管道文件。


三、练习:
利用有名管道使进程A将"Hello World"发送给进程B:
代码如下:
管道文件名为:baby

写操作:文件名:a.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>

int main()
{
	int fr = open("baby",O_WRONLY);
	assert(fr != -1);
	printf("open succes\n");
	write(fr,"hello world",11);
	close(fr);
	exit(0);
}

读操作:文件名:b.c

#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
#include <fcntl.h>
#include <assert.h>


int main()
{
	int fr = open("baby",O_RDONLY);
	assert(fr != -1);
	printf("open succes\n");
	char buff[20];
	read(fr,buff,15);
	printf("buff = %s\n",buff);

	exit(0);
}

运行结果:

只运行  ./a的时候

什么也没有打印,而我们在函数内部定义的打开成功则打印"open succes",但是输出面板上并没有,说明open这个函数打开并没有成功。反过来我们看读取文件。
 

只运行 ./b(读取文件)的时候

也是没有打印和上述现象一模一样,那这到底是什么原因呢。我们接着试一下,两个程序(进程)同时运行时会有什么现象,理想情况下,两个都会打印open succes,b文件也就是读取文件会打印Hello World 。

两个同时运行:打开两个终端,分别运行./a  ./b

当./a 命令发出时,没有变化,当./b继续执行时,这时候./a执行的终端下打印出了open succes,说明管道文件打开成功,而./b在它的所在终端下也打印出了open succes,和Hello World 说明一切与预想的一模一样。这又是为什么呢,为什么两个程序单独执行的时候open都没有执行,而当同时执行的时候,两个程序都运行正常呢。

提到这里,它的主要原因是与有名管道的特性分不开的。

open阻塞:
对于./a程序,当单独运行的时候,open以只写方式打开上面所创建的管道文件baby,这时候,open函数会阻塞运行,直到有另外一个进程以只读或者读写的方式去打开管道文件的时候,两个进程才会运行下去。
反之对于./b程序,当程序单独运行且open以只读方式打开所创建的管道文件baby,也会引起阻塞,直到有一个进程以只写或者读写的方式打开管道文件,才会成功运行下去。

read阻塞:
read函数也会引起阻塞运行,直到管道中有数据或者写端关闭。

write阻塞:
write函数也会引起阻塞运行,当管道文件写满的时候。

这里管道文件满,说明管道文件也有一个容量上限,我们知道管道文件在内存上,而内存的大小,在32位系统上是4GB大小,那么管道文件到底是默认多大呢(肯定比4GB小);
下面我们做一个小测试:
测试内容:
管道文件的大小:

代码如下:

#include <stdio.h>
#include <stdlib.h>
#include <assert.h>
#include <fcntl.h>
#include <unistd.h>


void main()
{
	int fd = open("FIFO",O_RDWR);
	assert(fd != -1);
	int count = 0;
	while(1)
	{
		write(fd,"x",1);
		count++;
		printf("count == %d\n",count);
	}
	
	close(fd);

	exit(0);
}

结果:

count显示是65536,而我们每次往管道文件写一个char 类型的‘x’,意思写了65536个‘x’,也就是65536个字节,当写到65536的时候,程序不再执行,说明管道文件已满,这时候,就是管道文件的最大容量。也就是管道文件默认容量 = 65536字节 = 64k字节 = 16个页面(这里的1k就是1024字节)。我们其实也可以用fcntl函数来修改管道容量(后期将解释)。

四、半双工和全双工通讯

半双工通讯:在一次通讯中,数据流向是单向的。如对讲机和以前的电报
全双工通讯:在任意时刻,数据都可以双向流通。如现在的手机通信。

sap销售发货的流程_SAP销售订单发货后如何实现发票的自动创建? 问SAP销售订单发货后如何实现发票的自动创建?答业务场景有些快消零售企业,SAP系统单据量大,单据金额少,一般在销售发货后即可确认收入。此时无需人工在系统内操作VF01或者VF04进行开票操作,可将该操作设置成后台作业进行自动批量开票,具体操作如下:1、定义任务:VF06输入完以上信息,点击保存进入以下界面:说明:当前日期的意思是“开票的日期”等于“系统电脑中的当前日期”当前日期+/-... 阅读详情

相关推荐

MAC 青花瓷(Charles)爪机HTTPS 抓包

前段时间跟之前的产品小姐姐聊天,小姐姐说开发让她抓包帮忙看下数据,然而自己又不会,那就来写一篇简易版的教程 冲冲冲! 手上只有mac电脑跟iPhone手机,只做苹果手机的抓包,android7.0以上版本也没法通过正常的抓htts的包,让安卓开发装个后门吧,不是安卓开发并不知道是啥,连上USB之后访问chrome://inspect/#devices就能很简单的抓包 一、准备工具等 青花瓷...

Promise的博客 1615

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

有名管道实现进程间通信

sinat_41752325的博客 3615

ADRV9009学习资料保存:基于XC7Z100+ADRV9009的双收双发无线电射频板卡

ADRV9009学习资料保存:基于XC7Z100+ADRV9009的双收双发无线电射频板卡 一、板卡概述 基于XC7Z100+ADRV9009的双收双发无线电射频板卡是基于XilinxZYNQFPGA和ADI的无线收发芯片ADRV9009开发的专用功能板卡,用于5G小基站,无线图传,数据收发...

9368

进程通信之有名管道(双向通信)

有名管道

中华神威的博客 2072

unity转微信小游戏:UI大小设置

unity转微信小游戏:UI大小设置

会潜水的小火龙的博客 3273

SSD |(二)SSD主控

控制器作为一个片上系统,处理来自用户端的命令并负责管理闪存颗粒。

知识库搭建ing 1963

【命名管道】命名管道(FIFO)与进程通信

命名管道(FIFO)为我们提供了一个在不同进程间进行数据传递的简单而有效的途径。了解如何正确使用FIFO,避免常见的问题,比如权限设定和缓冲区管理。虽然有其复杂性,但是只要掌握了这些要点,我们就能够用好FIFO,为进程间的通信带来便利。

crr411422的博客 1038

ardupilot如何让官网支持自己的硬件方案

本节主要记录ardupilot中如何让官网支持自己的硬件方案。参考1参考2。

陌城烟雨 159

进程间通信——有名管道原理及详解(附有案例代码)

有名管道(FIFO)不同于匿名管道之处在于它提供了一个路径名与之关联,以 FIFO的文件形式(特殊文件形式)存在于文件系统中,并且其打开方式与打开一个普通文件是一样的,这样即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径就能够彼此通过 FIFO相互通信,因此,通过FIFO不相关的进程也能交换数据。 一旦打开了 FIFO,就能在它上面使用与操作匿名管道和其他文件的系统调用一样的I/O系统调用了 (如read ( ). write()和close())。与管道一样, FIFO也有一个

热爱数据库的小胖 2352

【HomeAssistant接入的设备实现天猫精灵】

Home Assistant的HassLife组件: 此Home Assistant的组件可以让天猫精灵、小爱同学对接HomeAssistant平台上的设备,控制设备、查询上报设备状态。 注意:本插件只负责上报HomeAssistant的设备状态信息到服务器,控制功能需要在HassLife 平台上配置。.........

vor234的博客 1万+

AXI2APB_bridge 设计

此处研究AHB Slave到 APB master的桥接器,实现接口转化,例如下图之后是参数描述

Starry__的博客 4037

有名管道通信

多个进程间数据相互交换,即进程间通信有以下方式: 信号通信、管道通信(有名管道通信和无名管道通信)、信号量通信、消息队列通信、共享内存(或共享储存)、套接字通信。 如果进程A输入“hello world”,进程B读取并输入,有什么方式可以做到呢?之前学过父子进程,在父子进程之间全局变量、栈区变量、堆区变量都是不共享的,但是文件偏移量是共享的,文件可以做到但是有缺陷:1、不能同步,也

Mylily_123的博客 1028

Linux性能调优之CPU时间分布(亲和性、带宽、权重)配置

带宽权重亲和性进程级别Cgroup-v2服务级别systyemd我所渴求的,無非是將心中脫穎語出的本性付諸生活,為何竟如此艱難呢 ------赫尔曼·黑塞《德米安》

山河已无恙 1714

进程间通讯-有名管道,信号(一)、信号(二)

创建两个⼦进程 A 与 B,给⼦进程 A 发送 SIGUSR1 信号, ⼦进程 B 发送 SIGUSR2 信号,⼦进程 A 的处理⽅式设置为默认, ⼦进程 B 的处理⽅式为使⽤⾃定义处理函数,并打印接收的信号的字符串信息(使⽤ strsignal() 函数)信号是在软件层次上 是⼀种通知机制, 对中断机制的⼀种模拟,是⼀种异步通信⽅式, ⼀般具有。如果有名管道的⼀端以只读⽅式打开,它会阻塞到另⼀端以写的⽅式 (只写,读写)创建⼀个⼦进程, ⽗进程给⼦进程发送 SIGUSR1 信号,并使⽤⾃定义的处理。

interese的博客 765

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

IMSL CNL 7.0.0 (x86-64)Crack

IMSL CNL 7.0.0 (x86-64)Crack intel的算法库破解文件,这是C++版本的破解文件

Linux进程通讯—有名管道FIFO

FIFO 和 Pipe 一样,提供了双向进程间通信渠道。但要注意的是,无论是有名管道还 是匿名管道,,否则可能出现通信混乱(进程读到自己发的 数据)采用库函数创建。

weixin_45706195的博客 699

计算机控制技术及应用

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

进程间通讯——管道(有名管道)

      前几天我们简单的介绍了进程间通讯的一种渠道——管道,我们有说道管道的概念,管道的通讯原理,还提到了管道的两种类型:有名管道和无名管道,今天我们就来说说有名管道吧      基本概念: 有名管道在文件目录中有一个文件标示(管道文件)。实际不占据磁盘空间。数据缓存在内存上(只有使用时内存才开辟,由于在内存上,因此管道文件的属性中所占空间大小为0字节;当两个进程间一读一写完

YanJing1314的博客 433

pscad IEEE标准系统搭建说明

pscad IEEE标准系统搭建说明,包含典型的IEEE 9节点、14节点、30节点、39节点和118节点系统。内含标准测试系统的原始数据和潮流结果。

10-20 IO作业​-使用有名管道实现两个进程间的双向通讯​

实现两个进程间的双向通讯。

2403_87001562的博客 240

进程间通讯--有名管道

有名管道特点 1.对应管道文件,可用于任意进程间进行通讯 2.打开管道时可指定读写方式 3.通过文件IO操作,内容存放在内存中 有名管道创建–mkfifo #include <unistd.h> #include <fcntl.h> int mkfifo(const char* path, mode_t mode); 1.成功时返回0,失败时返回EOF 2.path创建的管道文件路径,之后可对文件进行读写 3.mode管道文件的权限,如0666 代码示例 写程序 #include

qq_22700863的博客 185

进程间通讯-有名管道

大家都知道,在一个电脑上,同一时间同时运行着很多进程,各个进程之间单独运行,但是也有一些进程需要进行通信,那么进程间又如何进行通信呢?今天我就跟大家讲讲进程间是如何通过管道通信的。   进程间通信:是指多个进程之间数据相互转换。   进程间通讯的方式:       单机通讯:信号、管道(有名管道、无名管道)、信号量、消息队列、共享存储       多机通讯:套接字(socket)   管

yqy_yangqingyu的博客 313

Linux进程间通讯--管道(有名管道

时隔很久,再来更博... 今天主要写的是Linux中进程间通讯,进程间进行通讯的目的就是多个进程之间数据互相交换。 进程间通讯方式有以下几种: 信号 管道:分为有名管道和无名管道 信号量 消息队列 共享存储(共享内存) 套接字(socket) 其中套接字属于多机通讯(全双工通讯),其余的属于单机通讯(半双工通讯),所谓的半双工通讯就是在同一时刻里信息只能有一个传输方向,生活中的例

AIDOU_LBJ的博客 527

进程(二):进程间通讯:无名管道/有名管道

无名管道/有名管道

Linux 503

linux进程间通讯-有名管道

文章目录阻塞和非阻塞概念通过fcntl函数设置文件的阻塞特性文件描述符概述文件描述符的复制 阻塞和非阻塞概念 如果是阻塞,管道中没有数据,read会一直等待,直到有数据才会继续运行,否则一 直等待。 如果是非阻塞,read函数运行时,会先看一下管道中是否有数据,如果有数据,则正常运行读取数据,如果管道中没有数据,则read函数会立即返回,继续下面的代码运行。 通过fcntl函数设置文件的阻塞特性 功能 函数 设置为阻塞: fcntl(fd, F_SETFL, 0); 设置为非阻塞: f

weixin_44681745的博客 631

进程间的通讯,有名管道,无名管道

一,进程间的通讯(ipc) 进程间的通讯:在两个进程间进行信息的交换或数据的传递; 进程间的通讯:管道,信号量,共享内存,消息队列,套接字; 实现两个进程间的通讯(用以前的知识解决问题):创造一个库文件,a进程给文件中写入数据,b进程从文件中读取数据; 缺点:文件在磁盘上,磁盘的速度远远低于内存的速度; 需要一些信号量的控制; 管道文件的操作和正常文件是一样的只是在打开管道文件时要求必须要两个进程打开了这个管道负责open就会被阻塞住; 磁盘只存放管道文件的属性(名字等)不存放内容 二,有名管道 1

weixin_45510561的博客 198

进程间通讯(一) 有名管道

一、管道文件 1、A进程---->B进程   A进程的数据流通过通道向B进程 2、半双工通讯:数据流向单向传输 (同一时间)    全双工通讯:数据流向双向传输 (同一时间)

qq_39823627的博客 857

进程间的通讯之有名管道

有名管道在内存中开辟一块新的空间,2个进程通过文件描述符操作这片空间,可以再任意两个进程间传递数据。仅仅是目 录树中的一个标示, 并不在磁盘上空间。 那么如何创建一个管道文件,有2个方式,一个使用mkfifo命令创建另一个是在程序中用mkfifo()函数创建。 如何使用管道文件,和普通文件一样,使用open,read,write,close函数操作。 但是和其他文件不同,主要有以下

sx758218950的博客 349

进程通讯中的有名管道

1.有名管道:     在文件系统种,有个管道的节点。然后两个不同进程,可以通过系统IO所提供的接口函数,去实现通讯。     open   read/write   close 2.创建     mkfifo(char *name,mode_t mode); 第一个参数为创建节点的名字,第二个参数为创建这个节点的访问权限 3.包含的头文件及函数       #include &lt;sy...

qq_37589838的博客 215
上一篇: 信号使用以及处理
下一篇: 进程通讯之无名管道
IT_model
博客等级 码龄9年 61粉丝 48原创
评论 3
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值