众所周知,FIFO中文译为命名管道,是PIPE的升级版。而PIPE是管道,系统提供的一种进程间通讯方式,FIFO与PIPE有以下方面不同:

1) FIFO需要先在文件系统创建(mkfifo),之后使用文件接口操作(open/close/read/write);而PIPE不与文件系统相关联,创建PIPE后直接读写(pipe),无需打开;

2) PIPE只能在父子关系的进程间使用,本质是通过fork复制了母进程空间从而扩展到另一个进程;而FIFO关联的各个进程间更为自由,不必由fork产生也可以使用。

但他们都是管道,本质上就是内核开辟的一块缓存区,虽然FIFO在文件系统有一个入口,但是它和文件有很大不同,具体体现在使用FIFO的文件接口的几个限制上:

1) 如果读进程以只读方式打开FIFO,若此时还没有写进程打开FIFO,则读进程会阻塞在open上,直到有进程以写方式打开FIFO文件;

2) 如果写进程以只写方式打开FIFO,若此时还没有读进程打开FIFO,则写进程会阻塞在open上,直到有进程以读方式打开FIFO文件;

3) 如果进程以读写方式打开FIFO,此时open将不再阻塞,但是如果此时没有写进程向管道内写数据,则读取将阻塞在read上,直到有进程写入数据为止。(需要注意的是如果之前有进程写入过数据,但是该进程在本进程open之前已经关闭FIFO,则相应的数据是读不到的);

4) 如果进程以读写方式打开FIFO,此时open将不再阻塞,不管有没有读进程从管道读数据,写数据(write)都将成功返回,直到底层缓冲区被写满;

5) 如果进程以只读且异步方式(O_NONBLOCK)打开FIFO,则不论有没有写进程打开FIFO,都不会阻塞在open上。但如果此时没有写进程写入数据,后续read将返回0;

6) 如果进程以只写且异步方式(O_NONBLOCK)打开FIFO,若此时还没有读进程打开FIFO,则open返回-1,errno设置为ENXIO(6 /* No such device or address */)

一般很少用读写方式打开FIFO,因为那样很容易读到自己写入的数据,除非此FIFO就是用来在进程内部多个线程之间使用的。

可以看到上面林林总总的各种限制,指向的一个目标就是:保证读写进程同时打开FIFO并进行数据交换。换句话说,就是FIFO没有任何临时存储数据的能力,错过了,就没了。

从这个意义上说,FIFO根本不是文件。

除此之外,FIFO在读写进程退出时的表现,也与PIPE相似,而与文件不同:

1) 当所有读进程退出后,写进程再写入数据会收到SIGPIPE信号;

2) 当所有写进程退出后,读进程再读取数据read会返回0;

对于第1点,特别声明一下,就是在PIPE中,多对一的情况与一对一读写进程不同,当读进程退出时,多个写进程并没有收到SIGPIPE信号,详见下面这篇文章:

多进程管道读写的一些疑问

总之,从各方来说,FIFO都是一个PIPE,而不是一个传统意义上的文件

测试读代码

测试写代码

[apue] FIFO:不是文件的文件的更多相关文章

  1. 配置apue的头文件apue.h和unp的头文件anp.h

    配置apue的头文件apue.h和unp的头文件anp.h 如果要使用gcc -g 来生成可调试文件一定要修改Make.defines.linux文件中的CFLAGS变量 修改为:CFLAGS=-an ...

  2. APUE学习笔记——6 系统数据文件与信息

    1.用户口令:/etc/passwd文件 该文件中包含下列结构体信息.其中,当下主修熊passwd不再这里显示,是使用了一个占位符. struct passwd { char * pw_name; / ...

  3. linux find 命令查找文件和文件夹

    查找目录:find /(查找范围) -name '查找关键字' -type d查找文件:find /(查找范围) -name 查找关键字 -print 详解: find命令用来在指定目录下查找文件.任 ...

  4. shutil——高级的 文件、文件夹、压缩包 处理模块

    高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])复制文件内容(不包含元数据)从类文件对象src到类文件对dst.可选参数leng ...

  5. Linux温习(三)Linux文件和文件夹管理

    关于Linux文件夹的几个常见概念 路径 对文件位置信息的描写叙述机制.是指从树型文件夹中的某个文件夹层次到其内某个文件的一条通路.分为相对路径和绝对路径: 工作文件夹 登入系统后.用户始终处于某个文 ...

  6. UNIX环境高级编程之第4章:文件和文件夹-习题

    4.1 stat函数是尾随符号链接的,所以用stat替换lstat不会显示符号链接的信息 4.2 在一个目录下先再shell中输入umask shell进程再进行创建文件的操作.其权限抖都会被屏蔽 4 ...

  7. 16. Linux find查找文件及文件夹命令

    find的主要用来查找文件,查找文件的用法我们比较熟悉,也可用它来查找文件夹,用法跟查找文件类似,只要在最后面指明查找的文件类型 -type d,如果不指定type类型,会将包含查找内容的文件和文件夹 ...

  8. SQL Server中的高可用性(2)----文件与文件组

        在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...

  9. Java实现FTP文件与文件夹的上传和下载

    Java实现FTP文件与文件夹的上传和下载 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制 ...

  10. C# 拷贝指定文件夹下的所有文件及其文件夹到指定目录

    要拷贝的文件及其文件夹结构 其中.lab文件不能覆盖 /// <summary> /// 拷贝oldlab的文件到newlab下面 /// </summary> /// < ...

随机推荐

  1. 2019.10.28 CSP%您赛第四场t3

    我写不动前两个了. 原谅一下. ____________________________________________________________________________________ ...

  2. 后台添加Textbox

    /// <summary> /// behind add textbox /// </summary> private void AddTextToTextBox() { Te ...

  3. javascript严格模式的影响

    针对js严格模式会报错的编码操作进行了整理,避免不严谨的代码习惯,面向未来编程(es6+) 变量 1.定义八进制格式的数字 2.不带var的变量定义--包括函数体内的 3.对变量的delete操作-- ...

  4. css四种基本选择器

    css选择器是什么? 要使用css对HTML页面中的元素实现一对一,一对多或者多对一的控制,这就需要用到CSS选择器. HTML页面中的元素就是通过CSS选择器进行控制的. CSS选择器:就是指定CS ...

  5. CSPS模拟 57

    rank4大众rank T1 天空龙 让他自由翱翔吧 T2 巨神兵 对于n=10的测试点本可以打出非常优秀的分层状压 但是没有打出来,因为对拓扑图理解不够深刻,纠结于指回的边,实际上只关注伸出的边就可 ...

  6. Redis性能解析--Redis为什么那么快?

    echo编辑整理,欢迎转载,转载请声明文章来源.欢迎添加echo微信(微信号:t2421499075)交流学习. 百战不败,依不自称常胜,百败不颓,依能奋力前行.--这才是真正的堪称强大!!! Red ...

  7. python学习之【第十七篇】:Python中的面向对象(类和对象)

    1.什么是类和类的对象? 类是一种数据结构,我们可以用它来定义对象,后者把数据值和行为特性融合在一起,类是现实世界的抽象的实体以编程形式出现.实例是这些对象的具体化.类是用来描述一类事物,类的对象指的 ...

  8. P3067 [USACO12OPEN]平衡的奶牛群(折半暴搜)

    暴搜无疑.... 首先考虑纯暴搜...... 考虑每一个数: 选在左边集合 选在右边集合 不选 一共三种情况,用一个数组记录搜到的答案,所以暴搜是3^N的复杂度...直接死亡 于是讲折半暴搜.... ...

  9. CDQ分治学习笔记(三维偏序题解)

    首先肯定是要膜拜CDQ大佬的. 题目背景 这是一道模板题 可以使用bitset,CDQ分治,K-DTree等方式解决. 题目描述 有 nn 个元素,第 ii 个元素有 a_iai​.b_ibi​.c_ ...

  10. 算法编程题积累(1)——网易笔试"工程师工作安排“问题

    首先理解题目意思:每个人只能做工作序号表里的一件工作且两个人不能同时做一件工作.AC思路:采用暴力枚举每种可能的分配方案,子问题的解决逐步向上解决了母问题,最终原问题得解. 标程作者:NotDeep( ...