17、有名管道与无名管道之间的区别
1)无名管道:管道是半双工的,数据只能向一个方向流动;需要双方通信时,需要建立起两个管道;只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程)。
单独构成一种独立的文件系统:管道对于管道两端的进程而言,就是一个文件,但它不是普通的文件,它不属于某种文件系统,而是自立门户,单独构成一种文件系统,并且只存在与内存中。
数据的读出和写入:一个进程向管道中写的内容被管道另一端的进程读出。写入的内容每次都添加在管道缓冲区的末尾,并且每次都是从缓冲区的头部读出数据。(有点像队列哈)
#include <unistd.h>
int pipe(int fd[2])
该函数创建的管道的两端处于一个进程中间,在实际应用中没有太大意义,因此,一个进程在由 pipe()创建管道后,一般再fork一个子进程,然后通过管道实现父子进程间的通信(因此也不难推出,只要两个进程中存在亲缘关系,这里的亲缘关系指的是具有共同的祖先,都可以采用管道方式来进行通信)。
向管道中写入数据时,linux将不保证写入的原子性,管道缓冲区一有空闲区域,写进程就会试图向管道写入数据。如果读进程不读走管道缓冲区中的数据,那么写操作将一直阻塞。
注:只有在管道的读端存在时,向管道中写入数据才有意义。否则,向管道中写入数据的进程将收到内核传来的SIFPIPE信号,应用程序可以处理该信号,也可以忽略(默认动作则是应用程序终止)。
2)有名管道:不同于管道之处在于它提供一个路径名与之关联,以FIFO的文件形式存在于文件系统中。这样,即使与FIFO的创建进程不存在亲缘关系的进程,只要可以访问该路径,就能够彼此通过FIFO相互通信(能够访问该路径的进程以及FIFO的创建进程之间),因此,通过FIFO不相关的进程也能交换数据。值得注意的是,FIFO严格遵循先进先出(first in first out),对管道及FIFO的读总是从开始处返回数据,对它们的写则把数据添加到末尾。它们不支持诸如lseek()等文件定位操作。
有名管道的创建
#include <sys/types.h>
#include <sys/stat.h>
int mkfifo(const char * pathname, mode_t mode)
该函数的第一个参数是一个普通的路径名,也就是创建后FIFO的名字。第二个参数与打开普通文件的open()函数中的mode 参数相同。如果mkfifo的第一个参数是一个已经存在的路径名时,会返回EEXIST错误,所以一般典型的调用代码首先会检查是否返回该错误,如果确实返回该错误,那么只要调用打开FIFO的函数就可以了。一般文件的I/O函数都可以用于FIFO,如close、read、write等等
3)无名管道由一个在基本文件系统存储设备上的INODE,一个与其相连的内存INODE,两个打开文件控制块(分别对应管道的信息发送端和信息接收端)及其所属进程的描述信息来标识,在系统执行PIPE(P)命令行之后生成。并在P[0]中返回管道的读通道打开文件描述等,在P[1]中返回管道的写通道打开文件描述符。从结构上看,无名管道没有文件路径名,不占用文件目录项,因此文件目录结构中的链表不适用于这种文件,它只是存在于打开文件结构中的一个临时文件,随其所依附的进程的生存而生存,当进程终止时,无名管道也随之消亡。
送入管道的信息一旦被读进程取用就从管道中消失了,读写操作之间符合先进先出的队列原则。
管道文件是进程间通信的工具,为了尽量少的占用系统存储资源,一般系统均将其限制为最大长度为4096(PIPSIZ)字节的小型文件。当欲写入的消息超过4096字节时,就产生了读、写进程之间的同步问题。首先写操作查找PIPE文件中当前指针的偏移量F-OFFSET,然后从此位置开始尽量写入信息,当长度达到4096字节时,系统控制写进程进入睡眠状态,一直等待读进程取走全部信息时,文件长度指针置0,写进程才被唤醒继续工作。
为防止多个进程同时读写一个管道文件而产生混乱,在管道文件的INODE标志字I-FLAY项中设置了ILOCK标志项,以设置软件锁的方式实现多进程间对管道文件的互斥使用。
无名管道存在着如下两个严重的缺点。
第一,无名管道只能用于连接具有共同祖先的进程。
第二,无名管道是依附进程而临时存在的。所以后来推出了一种无名管道的变种-有名管道,它常被称为FIFO。有名管道除继承了无名管道的所有特性优点之外,还屏弃了无名管道的两个缺点。
首先,FIFO是一种永久性的机构,它具有普通的UNIX系统文件名。在系统下可利用MKNOD命令建立永久的管道,除非刻意删除它,否则它将一直保持在系统中。
其次,正是由于有名管道以“文件名”来标识,所以只要事先约定某一特定文件名,那样所有知道该约定的服务进程,不论它们之间是否有亲属关系,都可以便利地利用管道进行通信。
通过下面的命令可以创建一个命名管道:
/etc/mknod pipe_name p
其中“pipe_name”是要创建的命名管道的名字,参数p 必须出现在命名管道名字之后。
命名管道文件被创建后,一些进程就可以不断地将信息写入命名管道文件里,而另一些进程也可以不断地从命名管道文件中读取信息。对命名管道文件的读写操作是可以同时进行的。下面的例子显示命名管道的工作过程。
进程A、B、C中运行的程序只是一条简单的echo命令,它们不断地把信息写入到命名管道文件/tmp/pipe1中。与此同时,程序中的“read msg”命令不断地从命名管道文件/tmp/pipe1中读取这些信息,从而实现这些进程间的信息交换。
程序执行时,首先创建命名管道文件,此时程序处于等待状态,直到A、B、C进程中某一个进程往命名管道中写入信息时,程序才继续往下执行。使用rm命令可以删除命名管道文件从而清除已设置的 命名管道。
下面是一个用于记录考勤的例子:
在主机上运行的程序/tmp/text产生命名管道/tmp/pipe1,并不断地从命名管道中读取信息送屏幕上显示。
/tmp/text程序:
if [ ! -p /tmp/pipe1 ]
then
/etc/mknode /tmp/pipe1 p
fi
while :
do
read msg
if [ “$msg" = “" ]
then
continue
else
echo “$msg"
fi
done < /tmp/pipe1
在终端上运行的是雇员签到程序/tmp/text1。每个雇员在任何一台终端上键入自己的名字或代码,程序/tmp/text1将把这个名字连同当时的签到时间送入命名管道。
/tmp/text1程序:
tty=‘who am I | awk ‘{print $2}’’
while :
do
echo “Enter your name: \c" > /dev/$tty
read name
today=‘date’
echo “$name\t$today"
done > /tmp/pipe1
当雇员从终端上输入自己的姓名后,运行/tmp/text程序的主机将显示类似下面的结果:
wang Thu Jan 28 09:29:26 BTJ 1999
he Thu Jan 28 09:29:26 BTJ 1999
cheng Thu Jan 28 09:30:26 BTJ 1999
zhang Thu Jan 28 09:31:26 BTJ 1999
named pipes(命名管道)管道具有很好的使用灵活性,表现在:
1) 既可用于本地,又可用于网络。
2) 可以通过它的名称而被引用。
3) 支持多客户机连接。
4) 支持双向通信。
5) 支持异步重叠I/O操作。
不过,当前只有Windows NT,UNIX支持服务端的命名管道技术,win95/97/98等不支持。 SQL Server等数据库就有named pipes的连接方式。
(资料来源于互联网)
17、有名管道与无名管道之间的区别相关推荐
- linux系统调用创建无名管道,linux 无名管道pipe和有名管道FIFO
1.管道(pipe) 管道是进程间通信的主要手段之一.一个管道实际上就是个只存在于内存中的文件,对这个文件的操作要通过两个已经打开文件进行,它们分别代表管道的两端.管道是一种特殊的文件,它不属于某一种 ...
- 管道——(1)有名管道和无名管道
一.引子 之前,两个进程间要发送消息,是通过信号来完成的.创建通知事件,通过它引起响应,但是传送的信息只是一个信号值而已. 如果两个进程需要交换更有用.复杂的信息,就需要用到--管道. 管道--一个进 ...
- 有名管道和无名管道的介绍
文章目录 前言 一.无名管道 1.概念介绍 2.相关函数介绍 3.关于无名管道的一些说明 4.无名管道编程实战 二.有名管道 1.概念 2.编程实战 总结 前言 在进程间通信的几种方式中,管道可谓是最 ...
- 【Linux】管道文件(有名管道、无名管道)
[Linux]管道文件(有名管道.无名管道) 多进程编程的目的就是为了同时完成多个任务. 例如:一个产品,一个软件,需要n个进程同时执行才能完成,而这些进程之间一定是有所联系的. 因此:多进程工作时, ...
- linux管道文件的实现原理,管道(无名管道)通信机制原理和实现详解
管道(pipe)允许两个进程进行通信,是早期 UNIX 系统最早使用的一种IPC 机制.管道为进程之间的相互通信提供了一种较为简单的方法,尽管也有一定的局限性. 在实现管道时,应该考虑以下四个问题: ...
- 有名管道和无名管道的区别
1)无名管道:管道是半双工的,数据只能向一个方向流动:需要双方通信时,需要建立起两个管道:只能用于父子进程或者兄弟进程之间(具有亲缘关系的进程). 单独构成一种独立的文件系统:管道对于管道两端的进程而 ...
- Linux有名管道与无名管道简介
无名管道 无名管道是最古老的进程通信方式, 有如下两个特点: 1. 只能用于有关联的进程间数据交互, 如父子进程, 兄弟进程, 子孙进程, 在目录中看不到文件节点, 读写文件描述符存在一个 int 型 ...
- pipe 半双工_linux进程间通讯之管道(无名管道pipe)实现全双工双向通讯
管道是什么: 1. 管道只能用于具备亲缘关系的进程之间通讯. 2.管道是一种单工或者说半双工的通讯方式,传递信息的方向是固定的,只能由一端传递到另外一端. 头文件及函数原型: #include int ...
- Linux 3.进程间通信(IPC)(pipe 无名管道、mkfifo 有名管道、ftok、msgget、msgrcv、msgsnd、msgctl 消息队列)
Linux 3.进程间通信(IPC) 进程间通信: 进程间方式: pipe 管道(无名管道) 头文件及原型 特点 pipe 示例 FIFO(有名管道) 管道文件的创建 mkfifo 头文件及原型 mk ...
最新文章
- php 使用curl模拟登录discuz以及模拟发帖
- 《超越需求:敏捷思维模式下的分析》—第1章 1.2节交付价值
- win 8升级win8.1的几个问题
- 将十六进制的字符串转换成整数
- Android细节问题总结(二)
- C语言实现hashset算法(附完整源码)
- 2020快手用户及营销报告
- BasicAuth和OAuth
- @转载 ASP.NET跨页面传值技巧
- java ee自学_自学JavaEE难度大不大?
- ArcGIS打开shapefile失败:形状数与记录表数不一致
- 灵棋排盘(七政四余)入门指导—排盘与框架
- Windows安全加固系列---日志配置操作
- 大数据分析与可视化介绍,基于机器学习的大数据分析具有哪些独特的特点
- Maximize The Beautiful Value (前缀和贪心)
- 100万算大钱还是小钱?
- 如何提高项目估算精准度 关键有3方面
- 大学开启大数据开发之路
- 电蚊拍 电路图 原理
- HUOJ-10857 最大的面积 凸包+DP
热门文章
- 计算机视觉与深度学习 | 基于MATLAB 使用CNN拟合一个回归模型来预测手写数字的旋转角度(卷积神经网络)
- C语言 | 编写一个使用指针的c函数,交换数组a和数组b中的对应元素
- 新手小白零基础搭建个人博客(一)服务器篇
- php string to array,php string转数组的方法
- 英语语法---名词详解
- 趣学python3(21)-pygame-surface位置及角色移动
- PowerBI随笔(6)-filter、caculate、RELATED相关
- 【小白学PyTorch】7.最新版本torchvision.transforms常用API翻译与讲解
- 【数据竞赛】AI在垃圾分类中的应用小侃(海华大赛获奖者系列分享一)
- 推荐几款不错的写作利器