【Linux】管道文件(有名管道、无名管道)
【Linux】管道文件(有名管道、无名管道)
多进程编程的目的就是为了同时完成多个任务。
例如:一个产品,一个软件,需要n个进程同时执行才能完成,而这些进程之间一定是有所联系的。
因此:多进程工作时,进程间需要通讯(传递数据)。
fork()创建的子进程,与父进程之间唯一共享的是文件描述符。
进程之间的通讯方式有:
- 管道
- 信号量
- 消息队列
- 共享内存
- Socket (用于网络通讯,即不同主机上进程之间的通讯)
关于单工、半双工、全双工通讯
单工通讯:任意时刻,数据流向均为单向
半双工通讯:同一时刻,数据流向为单向(管道文件)
全双工通讯:任意时刻,数据流向双向,即有两条信道(A->B B->A)
管道
①有名管道(命令管道)
在磁盘上会存储一个管道文件表示(inode存于内存上),但它并不会占据磁盘空间(block),数据并不会存储到磁盘上。
有名管道限制:同一台主机上,同一个系统有权限操作管道文件的任意进程都可以通过其完成进程间通讯。
②无名管道
无名管道不存在管道文件,其借助于父子进程共享fork之前打开的文件描述符。(文件打开机制)其数据存储在内存中。
无名管道限制:只能使用于父子进程之间(无法跨越父子关系)
管道的使用
①有名管道的使用
1、创建管道文件
命令:mkfifo 文件名
函数:int mkfifo(const char* pathname , int mode);
(其中 pathname为路径+文件名 mode为权限)
2、打开管道文件
int open();同文件操作中open的使用。
仅仅打开文件,如果不存在,则无法创建。
参数有两个:
参数一:打开管道文件的路径+名称
参数二:打开文件方式
注意!!!!在仅仅一端打开时,open会阻塞,只到有读端、有写端,open才会返回。
读和写的次数无必然联系。
3、写操作
int write();同文件操作中write的使用。
4、读操作
int read();同文件操作中read的使用。
注意:读写操作也会阻塞↓
read阻塞:管道中无数据。
返回条件:管道中有数据/所有的写端关闭
write阻塞:管道缓存区满。
返回条件:管道中有空间/所有的读端关闭
5、关闭
Int close();同文件操作中close的使用。
例题练习:A进程接收用户输入,B进程统计用户输入字节的个数。
代码展示:
maina.c
mainb.c
结果:
②无名管道的使用
创建并且打开无名管道(自带open过程)
int pipe(int fds[2]);
fds[2]初始时同时打开,fd[0]管道读端, fd[1]管道写端
Fork();//注意:一定要在fork之前打开pipe
父子进程均可读可写
如果父-->子进程,则父进程关闭读端,子进程关闭写端
如果子-->父进程,则子进程关闭读端,父进程关闭写端
读端判断是否通讯完成,read返回值:0
例题练习:父进程接收用户输入,子进程统计字节并且输出。
代码:
结果:
【Linux】管道文件(有名管道、无名管道)相关推荐
- linux系统调用创建无名管道,无名管道系统调用
本文关键字: linux 管道通信,linux 进程通信方式,无名管道 1.管道创建与关闭说明 管道是基于文件描述符的通信方式,当一个管道建立时,它会创建两个文件描述符fd[0]和fd[1],其中fd ...
- linux进程间通讯-无名管道
文章目录 无名管道 无名管道的创建 -- pipe函数 无名管道的读写规律 无名管道 无名管道概述 管道(pipe)又称无名管道. 无名管道是一种特殊类型的文件,在应用层体现为两个打开的文件描述符.任 ...
- linux 进程间通信及makefile 无名管道/有名管道/共享内存/信号/消息队列
http://www.voidcn.com/article/p-hxvuiypm-mr.html https://www.cnblogs.com/wuyida/archive/2013/02/03/6 ...
- linux管道文件的实现原理,管道(无名管道)通信机制原理和实现详解
管道(pipe)允许两个进程进行通信,是早期 UNIX 系统最早使用的一种IPC 机制.管道为进程之间的相互通信提供了一种较为简单的方法,尽管也有一定的局限性. 在实现管道时,应该考虑以下四个问题: ...
- Linux进程通信:无名管道
进程通信目的: (1)数据传输:进程间数据传输: (2)通知事件:一个进程向另一个或一组进程发送消息,通知某个事件的发生(如子进程终止时需通知父进程): (3)资源共享:多个进程共享资源,需要内核提供 ...
- Linux有名管道与无名管道简介
无名管道 无名管道是最古老的进程通信方式, 有如下两个特点: 1. 只能用于有关联的进程间数据交互, 如父子进程, 兄弟进程, 子孙进程, 在目录中看不到文件节点, 读写文件描述符存在一个 int 型 ...
- linux进程间通信:无名管道 pipe
文章目录 内核层实现 结构 通信原理 特点 使用 函数声明 使用实例 单向通信 双向通信 编程注意事项 管道中无数据时读操作会阻塞 将管道的写端句柄关闭,不会影响读端数据读取 管道中没有数据,写操作关 ...
- Linux系统无名管道通信实验,Linux进程间通信(二)---管道通信之无名管道及其基础实验...
管道简介 管道是Linux中进程间通信的一种方式,它把一个程序的输出直接连接到另一个程序的输入(其实我更愿意将管道比喻为农村浇地的管子).Linux的管道主要包括两种:无名管道和有名管道.这一节主要讲 ...
- linux进阶34——无名管道
1. 管道通信 1.1 概念 一个进程在管道的尾部写入数据(管道的作用:数据的共享),另一个进程从管道的头部读出数据. 管道包括无名管道和有名管道.无名管道只能用于父进程和子进程间的通信,有名管道可用 ...
最新文章
- Unity AOP 处理异常的方法
- Centos 开放端口
- 三星s8和android auto,手机资讯导报:穿上马甲也认得三星GalaxyS8与LGG6再曝光
- rocketmq中各个角色介绍
- python 编译器pyc_有没有办法知道哪个Python版本.pyc文件被编译?
- c语言malloc返回值,malloc(0)的返回值
- 关于ajax表单提交.serialize()
- ArrayList非线程安全
- 计算机按键截图,怎么截图快捷键-如何给windows软件设定快捷键(截图工具、计算器、记事本等)...
- 用英文给领导写建议信
- FOI对象中显示labels --Oracle Map
- 纸牌游戏--小猫钓鱼
- C# Task.Result与Task.GetAwaiter.GetResult()区别
- “匠心之韵,数据之美”之数字营销专访【友盟+】一周年:不忘初心,从整合到融合,从合并到合力...
- The longest zig-zag subsequence
- 工程制图——尺寸标注
- 不惑之年一次性通过软考高项的苦与乐
- 你有没有过那种明知是对的但却没能去做的事?
- 想从事人工智能和大数据的学生们,这里有几条职业建议给你
- 2021年三季度中国医药商业行业A股上市企业营收排行榜:运盛医疗于8月初成功摘帽(附热榜TOP33详单)