- 浏览: 131483 次
文章分类
最新评论
FIFO 也被称为命名管道,未命名的管道只能在两个相关的进程之间使用,而且这两个相关的进程还要有一个共同的创建了它们的祖先进程。而通过 FIFO,即使不相关的进程也能交换数据。
FIFO 是一种文件类型,通过 stat 结构的 st_mode 成员可以知道文件是否是 FIFO 类型,可以用 S_ISFIFO 宏对此进行测试。创建 FIFO 类似于创建文件,它的路径名也的确存在与文件系统中(POSIX.1 的 XSI 扩展中还可通过 mknod 和 mknodeat 创建 FIFO,也可使用 mkfifo(1) 命令来创建)。
其中的 mode 参数的说明同 open 的 mode 相同。mkfifoat 函数和 mkfifo 相似,但是 mkfifoat 可以用来在 fd 文件描述符表示的目录相关的位置创建一个 FIFO,有以下 3 种情形。
(1)如果 path 参数指定的是绝对路径,则忽略 fd 参数,此时 mkfifoat 和 mkfifo 类似。
(2)如果 path 参数指定的是相对路径,则 fd 参数是一个打开目录的有效文件描述符,路径名和目录有关。
(3)如果 path 参数指定的是相对路径,并且 fd 参数有一个特殊值 AT_FDCWD,则路径名以当前目录开始,mkfifoat 和 mkfifo 类似。
当 open 一个 FIFO,非阻塞标志 O_NONBLOCK 会产生下列影响。
(1)在没有指定该标志的情况下,只读 open 要阻塞到某个其他进程为写而打开这个 FIFO 为止,只写 open 要阻塞到某个其他进程为读而打开它为止。
(2)指定了该标志时,则只读 open 立即返回。但如果没有进程为读而打开一个 FIFO,那么只写 open 将返回 -1,并将 errno 设置成 ENXIO。
类似于管道,若 write 一个尚无进程为读而打开的 FIFO,则产生信号 SIGPIPE。若某个 FIFO 的最后一个写进程关闭了该 FIFO,则将为该 FIFO 的读进程产生一个文件结束标志。一个给定的 FIFO 可能有多个写进程,如果不希望多个进程所写的数据交叉,则必须考虑原子写操作,可被原子地写到 FIFO 的最大数据量也是通过常量 PIPE_BUF 来指定的。
FIFO 有下面两种用途。
(1)shell 命令使用 FIFO 将数据从一条管道传送到另一条时,无需创建中间临时文件。
(2)客户-服务器进程应用程序中,FIFO 用作汇聚点,在客户进程和服务器进程之间传递数据。
下面的两个实例分别说明了这两种用途。
实例一:用 FIFO 复制输出流
FIFO 可用于复制一系列 shell 命令中的输出流,这就防止了将数据写向磁盘文件,类似于使用管道来避免中间磁盘文件。考虑这样一个过程,它需要对一个经过过滤的输入流进行两次处理。可以像下面这样使用 FIFO 和 tee(1) 程序来实现这样的过程而无需使用临时文件(tee 程序将其标准输入同时复制到其标准输出以及其命令行中命名的文件中)。
这里先在后台启动 prog3 来从 FIFO 读数据,然后使用 tee 将 prog1 的输出发送到 FIFO 和 prog2。下图显示了这样的进程安排。
实例二:使用 FIFO 进行客户进程-服务器进程通信
FIFO 的另一个用途是在客户进程和服务器进程之间传送数据。假设有一个服务器进程的每个客户进程都可以将它们的请求写到一个该服务器进程创建的众所周知的 FIFO 中。为避免客户进程的多次写之间的交叉,各客户进程发送给服务器的请求的长度要小于 PIPE_BUF 字节。为了将响应发送给各客户进程,服务器进程不能使用单个 FIFO,因为客户进程不可能知道何时去读它们的相应以及何时响应其他客户进程。一种解决办法是,每个客户进程都在其请求中包含它的进程 ID,然后服务器进程基于每个客户进程的进程 ID 为各个客户创建一个 FIFO,例如服务器进程可以用路径 /tmp/serv1.xxxx 创建 FIFO,其中 xxxx 表示客户进程的进程 ID。下图显示了这种安排。
虽然这种安排可以工作,但服务器进程不能判断一个客户进程是否崩溃终止,这就使得客户进程专用的 FIFO 会遗留在文件系统中。另外,服务器进程还必须得捕捉 SIGPIPE 信号,以免客户在发送请求后还没读取响应就终止了。还有如果服务器进程以只读方式打开众所周知的 FIFO,则每当客户进程个数变为 0 时,服务器进程就将在 FIFO 中读到一个文件结束标志。为使服务器进程免于处理这种情况,一种常用的技巧是使服务器进程以读-写方式打开该 FIFO。
FIFO 是一种文件类型,通过 stat 结构的 st_mode 成员可以知道文件是否是 FIFO 类型,可以用 S_ISFIFO 宏对此进行测试。创建 FIFO 类似于创建文件,它的路径名也的确存在与文件系统中(POSIX.1 的 XSI 扩展中还可通过 mknod 和 mknodeat 创建 FIFO,也可使用 mkfifo(1) 命令来创建)。
#include <sys/stat.h> int mkfifo(const char *path, mode_t mode); int mkfifoat(int fd, const char *path, mode_t mode); /* 两个函数的返回值:若成功,返回 0;否则,返回 -1 */
其中的 mode 参数的说明同 open 的 mode 相同。mkfifoat 函数和 mkfifo 相似,但是 mkfifoat 可以用来在 fd 文件描述符表示的目录相关的位置创建一个 FIFO,有以下 3 种情形。
(1)如果 path 参数指定的是绝对路径,则忽略 fd 参数,此时 mkfifoat 和 mkfifo 类似。
(2)如果 path 参数指定的是相对路径,则 fd 参数是一个打开目录的有效文件描述符,路径名和目录有关。
(3)如果 path 参数指定的是相对路径,并且 fd 参数有一个特殊值 AT_FDCWD,则路径名以当前目录开始,mkfifoat 和 mkfifo 类似。
当 open 一个 FIFO,非阻塞标志 O_NONBLOCK 会产生下列影响。
(1)在没有指定该标志的情况下,只读 open 要阻塞到某个其他进程为写而打开这个 FIFO 为止,只写 open 要阻塞到某个其他进程为读而打开它为止。
(2)指定了该标志时,则只读 open 立即返回。但如果没有进程为读而打开一个 FIFO,那么只写 open 将返回 -1,并将 errno 设置成 ENXIO。
类似于管道,若 write 一个尚无进程为读而打开的 FIFO,则产生信号 SIGPIPE。若某个 FIFO 的最后一个写进程关闭了该 FIFO,则将为该 FIFO 的读进程产生一个文件结束标志。一个给定的 FIFO 可能有多个写进程,如果不希望多个进程所写的数据交叉,则必须考虑原子写操作,可被原子地写到 FIFO 的最大数据量也是通过常量 PIPE_BUF 来指定的。
FIFO 有下面两种用途。
(1)shell 命令使用 FIFO 将数据从一条管道传送到另一条时,无需创建中间临时文件。
(2)客户-服务器进程应用程序中,FIFO 用作汇聚点,在客户进程和服务器进程之间传递数据。
下面的两个实例分别说明了这两种用途。
实例一:用 FIFO 复制输出流
FIFO 可用于复制一系列 shell 命令中的输出流,这就防止了将数据写向磁盘文件,类似于使用管道来避免中间磁盘文件。考虑这样一个过程,它需要对一个经过过滤的输入流进行两次处理。可以像下面这样使用 FIFO 和 tee(1) 程序来实现这样的过程而无需使用临时文件(tee 程序将其标准输入同时复制到其标准输出以及其命令行中命名的文件中)。
$ mkfifo fifo1 $ prog3 < fifo1 & $ prog1 < infile | tee fifo1 | prog2
这里先在后台启动 prog3 来从 FIFO 读数据,然后使用 tee 将 prog1 的输出发送到 FIFO 和 prog2。下图显示了这样的进程安排。
实例二:使用 FIFO 进行客户进程-服务器进程通信
FIFO 的另一个用途是在客户进程和服务器进程之间传送数据。假设有一个服务器进程的每个客户进程都可以将它们的请求写到一个该服务器进程创建的众所周知的 FIFO 中。为避免客户进程的多次写之间的交叉,各客户进程发送给服务器的请求的长度要小于 PIPE_BUF 字节。为了将响应发送给各客户进程,服务器进程不能使用单个 FIFO,因为客户进程不可能知道何时去读它们的相应以及何时响应其他客户进程。一种解决办法是,每个客户进程都在其请求中包含它的进程 ID,然后服务器进程基于每个客户进程的进程 ID 为各个客户创建一个 FIFO,例如服务器进程可以用路径 /tmp/serv1.xxxx 创建 FIFO,其中 xxxx 表示客户进程的进程 ID。下图显示了这种安排。
虽然这种安排可以工作,但服务器进程不能判断一个客户进程是否崩溃终止,这就使得客户进程专用的 FIFO 会遗留在文件系统中。另外,服务器进程还必须得捕捉 SIGPIPE 信号,以免客户在发送请求后还没读取响应就终止了。还有如果服务器进程以只读方式打开众所周知的 FIFO,则每当客户进程个数变为 0 时,服务器进程就将在 FIFO 中读到一个文件结束标志。为使服务器进程免于处理这种情况,一种常用的技巧是使服务器进程以读-写方式打开该 FIFO。
发表评论
-
打开伪终端设备
2018-07-09 20:50 1198在伪终端概述一节中已对 PTY进行了初步的介绍。尽管 ... -
伪终端概述
2018-06-02 11:05 1429伪终端就是指,一个应用程序看上去像一个终端,但事实上它 ... -
终端窗口大小和 termcap
2018-05-29 22:39 737多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的 ... -
终端规范模式和非规范模式
2018-05-29 00:25 874终端规范模式很简单:发一个读请求,当一行已经输入后,终 ... -
终端标识
2018-05-23 11:18 516尽管控制终端的名字在多数 UNIX 系统上都是 /de ... -
波特率和行控制函数
2018-05-22 07:53 887虽然大多数终端设 ... -
终端属性和选项标志
2018-05-20 07:40 667tcgetattr 和 tcsetattr ... -
终端特殊输入字符
2018-05-17 06:33 752终端支持下表所示的特殊输入字符。 为了更改 ... -
终端 I/O 综述
2018-05-10 07:56 384终端设备可认为是由内核中的终端驱动程序控制的。每个终端 ... -
POSIX 信号量
2018-05-09 00:03 532在XSI IPC通信之信 ... -
XSI IPC 通信之共享存储
2018-04-25 07:18 899在XSI IPC通信之消息队列和XSI IPC通信之信 ... -
XSI IPC通信之信号量
2018-04-17 23:38 571在XSI IPC通信之消 ... -
XSI IPC通信之消息队列
2018-04-15 10:54 439消息队列是消息的链接表,存储在内核中,由消息队列标识符 ... -
XSI IPC 相似特征介绍
2018-02-08 23:48 436有 3 种称作 XSI IPC ... -
IPC 通信之管道
2018-01-30 22:22 332管道是 UNIX 系统 IPC 的最古老但也是最常用的 ... -
readv/writev 函数及存储映射 I/O
2018-01-19 00:57 789readv 和 writev 函数可用于在一次函数调用 ... -
POSIX 异步 I/O
2018-01-16 21:33 403POSIX 异步 I/O 接口为对不同类型的文件进行异 ... -
fcntl 记录锁
2018-01-06 23:48 463记录锁的功能是:当有进程正在读或修改文件的某个部分时, ... -
守护进程惯例
2018-01-06 23:52 389UNIX 系统中,守护进程遵循下列通用惯例。 ... -
守护进程编写规则与出错记录
2017-12-26 01:53 391在编写守护进程程 ...
相关推荐
一个简单程序,演示了Linux下的FIFO IPC机制 http://blog.csdn.net/ZhengZhiRen/archive/2010/05/21/5613843.aspx
Linux进程间通信之FIFO,适用于任意进程间. 此C文件为FIFO的写端
Linux进程间通信之FIFO,适用于任意两个进程间.此C文件件为读端.
linux 进程间通信 pipe和fifo实现 。(此为博客http://blog.csdn.net/shallnet 文章对应源码下载)
进程间通信(IPC)几乎是所有Unix程序性能的关键,理解IPC也是理解如何开发不同主机间网络应用程序的必要条件。本书从对Posix IPC和System V IPC的内部结构开始讨论,全面深入地介绍了4种IPC形式:消息传递(管道、...
本书全面深入地讲述了各种进程间通信(IPC)形式,它们是几乎所有复杂精致的UNIX程序的性能之关键。从网络编程角度看,理解IPC也是理解如何开发不同主机间网络应用程序的必要条件。本书从对Posix IPC和System V IPC的...
卷2:进程间通信(第2版)》从对Posix IPC和System V IPC的内部结构开始讨论,全面深入地介绍了4种IPC形式:消息传递(管道、FIFO、消息队列)、同步(互斥锁、条件变量、读写锁、文件与记录锁、信号量)、共享内存(匿名...
《UNIX网络编程 卷2:进程间通信(英文版·第2版)》从对Posix IPC和System V IPC的内部结构开始讨论,全面深入地介绍了4种IPC形式:消息传递(管道、FIFO、消息队列)、同步(互斥锁、条件变量、读写锁、文件与记录锁、...
本书从对Posix IPC 和System V IPC 的内部结构开始讨论,全面深入地介绍了4 种IPC 形式:消息传递(管道、FIFO、消息队列)、同步(互斥锁、条件变量、读写锁、文件与记录锁、信号量)、共享内存(匿名共享内存、...
本书全面深入地讲述了各种进程间通信(IPC)形式,它们是几乎所有复杂精致的UNIX程序的性能之关键。从网络编程角度看,理解IPC也是理解如何开发不同主机间网络应用程序的必要条件。本书从对Posix IPC和System V IPC的...
进程间通信(IPC)几乎是所有Unix程序性能的关键,理解IPC也是理解如何开发不同主机间网络应用程序的必要条件。本书从对Posix IPC和System V IPC的内部结构开始讨论,全面深入地介绍了4种IPC形式:消息传递(管道、...
内容提要本书全面深入地讲述了各种进程间通信(IPC)形式,它们是几乎所有复杂精致的UNIX程序的性能之关键。从网络编程角度看,理解IPC也是理解如何开发不同主机间网络应用程序的必要条件。本书从对PosixIPC和...
内容提要本书全面深入地讲述了各种进程间通信(IPC)形式,它们是几乎所有复杂精致的UNIX程序的性能之关键。从网络编程角度看,理解IPC也是理解如何开发不同主机间网络应用程序的必要条件。本书从对PosixIPC和...
内容提要本书全面深入地讲述了各种进程间通信(IPC)形式,它们是几乎所有复杂精致的UNIX程序的性能之关键。从网络编程角度看,理解IPC也是理解如何开发不同主机间网络应用程序的必要条件。本书从对PosixIPC和...
内容提要本书全面深入地讲述了各种进程间通信(IPC)形式,它们是几乎所有复杂精致的UNIX程序的性能之关键。从网络编程角度看,理解IPC也是理解如何开发不同主机间网络应用程序的必要条件。本书从对PosixIPC和...
内容提要本书全面深入地讲述了各种进程间通信(IPC)形式,它们是几乎所有复杂精致的UNIX程序的性能之关键。从网络编程角度看,理解IPC也是理解如何开发不同主机间网络应用程序的必要条件。本书从对PosixIPC和...