[apue] FIFO:不是文件的文件
众所周知,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:不是文件的文件的更多相关文章
- 配置apue的头文件apue.h和unp的头文件anp.h
配置apue的头文件apue.h和unp的头文件anp.h 如果要使用gcc -g 来生成可调试文件一定要修改Make.defines.linux文件中的CFLAGS变量 修改为:CFLAGS=-an ...
- APUE学习笔记——6 系统数据文件与信息
1.用户口令:/etc/passwd文件 该文件中包含下列结构体信息.其中,当下主修熊passwd不再这里显示,是使用了一个占位符. struct passwd { char * pw_name; / ...
- linux find 命令查找文件和文件夹
查找目录:find /(查找范围) -name '查找关键字' -type d查找文件:find /(查找范围) -name 查找关键字 -print 详解: find命令用来在指定目录下查找文件.任 ...
- shutil——高级的 文件、文件夹、压缩包 处理模块
高级的 文件.文件夹.压缩包 处理模块 shutil.copyfileobj(fsrc, fdst[, length])复制文件内容(不包含元数据)从类文件对象src到类文件对dst.可选参数leng ...
- Linux温习(三)Linux文件和文件夹管理
关于Linux文件夹的几个常见概念 路径 对文件位置信息的描写叙述机制.是指从树型文件夹中的某个文件夹层次到其内某个文件的一条通路.分为相对路径和绝对路径: 工作文件夹 登入系统后.用户始终处于某个文 ...
- UNIX环境高级编程之第4章:文件和文件夹-习题
4.1 stat函数是尾随符号链接的,所以用stat替换lstat不会显示符号链接的信息 4.2 在一个目录下先再shell中输入umask shell进程再进行创建文件的操作.其权限抖都会被屏蔽 4 ...
- 16. Linux find查找文件及文件夹命令
find的主要用来查找文件,查找文件的用法我们比较熟悉,也可用它来查找文件夹,用法跟查找文件类似,只要在最后面指明查找的文件类型 -type d,如果不指定type类型,会将包含查找内容的文件和文件夹 ...
- SQL Server中的高可用性(2)----文件与文件组
在谈到SQL Server的高可用性之前,我们首先要谈一谈单实例的高可用性.在单实例的高可用性中,不可忽略的就是文件和文件组的高可用性.SQL Server允许在某些文件损坏或离线的情况下,允 ...
- Java实现FTP文件与文件夹的上传和下载
Java实现FTP文件与文件夹的上传和下载 FTP 是File Transfer Protocol(文件传输协议)的英文简称,而中文简称为"文传协议".用于Internet上的控制 ...
- C# 拷贝指定文件夹下的所有文件及其文件夹到指定目录
要拷贝的文件及其文件夹结构 其中.lab文件不能覆盖 /// <summary> /// 拷贝oldlab的文件到newlab下面 /// </summary> /// < ...
随机推荐
- Arduino学习笔记⑧ 红外通信
1.前言 红外通信是一种利用红外光编码进行数据传输的无线通信方式,在目前来说是使用非常广泛的.生活中常见电视遥控器,空调遥控器,DVD遥控器(现在估计是老古董了),均使用红外线遥控.使用红外线 ...
- 020 - FreeRTOS学习路线总结
零.为什么写? 在H7-tools预售群里,有位朋友提出如何学习FreeRTOS这类的问题,便由此总结下自己的学习路线.最近又打算接触RTT,和FreeRTOS做个对比. 文章分两步来讲,学习路线和学 ...
- 百万年薪python之路 -- 基础数据类型的补充
基础数据类型的补充 str: 首字母大写 name = 'alexdasx' new_name = name.capitalize() print(new_name) 通过元素查找下标 从左到右 只查 ...
- JVM(9) 程序编译及代码优化
一.早期(编译器)优化 1.编译期 Java 语言的 “编译期” 其实是一段 “不确定” 的操作过程,因为它可能是指 一个前端编译器(其实叫 “编译器的前端” 更准确一些)把 *.java 文件转变成 ...
- 设计模式(十九)State模式
在面向对象编程中,是用类表示对象的.也就是说,程序的设计者需要考虑用类来表示什么东西.类对应的东西可能存在于真实世界中,也可能不存在于真实世界中.对于后者,可能有人看到代码后会感到吃惊:这些东西居然也 ...
- unity单例封装
# 1.前言本篇主要针对Unity单例模式,完成一个可以重复继承使用的抽象类,减少重复的工作与代码.同时,对存在的多种单例进行优劣分析.# 2.Unity单例问题分析## 2.1 单例原则单例要满足以 ...
- 使用VS2013操作MYSQL8 (ADO.NET方式 & EF6)
今天有时间测试了一下通过.net环境操作MYSQL数据库,测试过程及结果记录如下: 1.MYSQL安装 (1)我是从MYSQL官网下载的最新版,即MYSQL8.0,在MySql官网的下载页面,找到“M ...
- SpringBoot之响应式编程
一 Spring WebFlux Framework说明 Spring WebFlux 是 Spring Framework 5.0 中引入的新 reactive web framework.与 Sp ...
- 【Windows系统】win10系统假死,窗口不能动,鼠标能动或不能动,最后蓝屏显示错误码: VIDEO_DXGKRNL_FATAL_ERROR 的解决办法
1. 问题的出现过程 最近博主自己用的 windows10 系统就碰到了这个问题. 一开始出现这个问题的征兆是鼠标会时不时地卡顿,一出现卡顿就会等个 1-3秒才能动.然后频繁卡顿(注意,这里根据经验就 ...
- Map文件从IDA到OD
目录 什么是map文件 IDA与OD导出使用map文件 注意事项 使用OD载入导出的map文件 什么是map文件 什么是 MAP 文件? 简单地讲, MAP 文件是程序的全局符号.源文件和代码行号信息 ...