众所周知,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. 解决Anki服务器同步问题:坚果云 & Floder sync (已测试)

    读前须知: 更新日期:2019-07-08 1.本教程面向对象为:有一定计算机知识人群 2.配合参考链接中的文章,共同食用. 3.已经过测试,可同步图片,音频,视频 4.尝试有风险,提前导出Anki卡 ...

  2. 从零开始把项目发布到maven仓库中心

    sonatype准备操作 注册账号 https://issues.sonatype.org 1. 密码符号规范,并且工记住 新建项目 1. group id 如果你有com域名的所有权可以直接使用,如 ...

  3. solr学习篇(三) solr7.4 连接MySQL数据库

    目录 导入相关jar包 配置连接信息 将数据库导入到solr中 验证是否成功 创建一个Core,创建Core的方法之前已经很详细的讲解过了,如果还是不清楚请参考 solr7.4 安装配置篇: 1.导入 ...

  4. HashMap - 类注释

    了解到Java8以后HashMap的实现换了,也看了很多博客一直在向我这个小菜鸡说HashMap的重要.因此我决定洗心革面,好好正视HashMap 基于jdk 8 先从类注释开始入手学习,顺便提高提高 ...

  5. codeforce - 13A A.Numbers

    A. Numbers time limit per test 1 second memory limit per test 64 megabytes input standard input outp ...

  6. Python网络爬虫之cookie处理、验证码识别、代理ip、基于线程池的数据爬去

    本文概要 session处理cookie proxies参数设置请求代理ip 基于线程池的数据爬取 引入 有些时候,我们在使用爬虫程序去爬取一些用户相关信息的数据(爬取张三“人人网”个人主页数据)时, ...

  7. Flask:Flask的模板系统和静态文件

    1.Flask模板系统 Django框架有自己独立的模板系统,而Flask是没有的,Flask默认采用jinjia2模板系统,jinjia2是仿写Django模板系统的一个第三方模块,但性能上要比Dj ...

  8. Oracle 相关操作SQL

    SELECT l.session_id sid, s.serial#, l.locked_mode, l.oracle_username, s.user#,l.os_user_name,s.machi ...

  9. 安卓—自定义 AlertDialog 的样式

    自定义修改安卓弹出框的样式 效果图: 1.在style.xml下添加 <!-- 自定义弹出样式 --> <style name="MyDialogStyle" p ...

  10. [考试反思]0719NOIP模拟测试6 + 0722NOIP模拟测试7

    连续爆炸,颇为愉快. 第6次:Rank #4 第7次:Rank #9 对于第6次考试,个人比较满意,因为T1只是差了一个卡常. 因为在考试前两天刚讲了矩阵,满脑子都是矩阵,还想到了循环矩阵优化. 整个 ...