- 浏览: 142216 次
文章分类
最新评论
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 1250在伪终端概述一节中已对 PTY进行了初步的介绍。尽管 ... -
伪终端概述
2018-06-02 11:05 1548伪终端就是指,一个应用程序看上去像一个终端,但事实上它 ... -
终端窗口大小和 termcap
2018-05-29 22:39 798多数 UNIX 系统都提供了一种跟踪当前终端窗口大小的 ... -
终端规范模式和非规范模式
2018-05-29 00:25 948终端规范模式很简单:发一个读请求,当一行已经输入后,终 ... -
终端标识
2018-05-23 11:18 568尽管控制终端的名字在多数 UNIX 系统上都是 /de ... -
波特率和行控制函数
2018-05-22 07:53 943虽然大多数终端设 ... -
终端属性和选项标志
2018-05-20 07:40 709tcgetattr 和 tcsetattr ... -
终端特殊输入字符
2018-05-17 06:33 814终端支持下表所示的特殊输入字符。 为了更改 ... -
终端 I/O 综述
2018-05-10 07:56 437终端设备可认为是由内核中的终端驱动程序控制的。每个终端 ... -
POSIX 信号量
2018-05-09 00:03 578在XSI IPC通信之信 ... -
XSI IPC 通信之共享存储
2018-04-25 07:18 946在XSI IPC通信之消息队列和XSI IPC通信之信 ... -
XSI IPC通信之信号量
2018-04-17 23:38 616在XSI IPC通信之消 ... -
XSI IPC通信之消息队列
2018-04-15 10:54 497消息队列是消息的链接表,存储在内核中,由消息队列标识符 ... -
XSI IPC 相似特征介绍
2018-02-08 23:48 484有 3 种称作 XSI IPC ... -
IPC 通信之管道
2018-01-30 22:22 389管道是 UNIX 系统 IPC 的最古老但也是最常用的 ... -
readv/writev 函数及存储映射 I/O
2018-01-19 00:57 887readv 和 writev 函数可用于在一次函数调用 ... -
POSIX 异步 I/O
2018-01-16 21:33 454POSIX 异步 I/O 接口为对不同类型的文件进行异 ... -
fcntl 记录锁
2018-01-06 23:48 614记录锁的功能是:当有进程正在读或修改文件的某个部分时, ... -
守护进程惯例
2018-01-06 23:52 438UNIX 系统中,守护进程遵循下列通用惯例。 ... -
守护进程编写规则与出错记录
2017-12-26 01:53 454在编写守护进程程 ...
相关推荐
标题中的"Linux下进程间通信FIFO演示程序"是一个用于展示如何在Linux环境下使用FIFO进行进程间通信的示例程序。通过这个示例,我们可以了解FIFO的基本用法和工作原理。 首先,FIFO是一种特殊的文件类型,它存在于...
管道通信,也称为命名管道(Named Pipe)或FIFO(First In First Out),是Linux和Unix-like操作系统中的一种进程间通信(IPC, Inter-Process Communication)机制。它允许不同进程之间进行单向或双向的数据传输,...
Linux进程间通信之FIFO,适用于任意进程间. 此C文件为FIFO的写端
描述中的"linux下进程间通信方式之一的fifo读写源程序"提示我们,压缩包内的“fifo”文件很可能是实现FIFO读写操作的C语言源代码。通过分析和运行这些代码,我们可以了解如何在Linux环境中使用FIFO进行进程间的通信...
Linux进程间通信之FIFO,适用于任意两个进程间.此C文件件为读端.
本文将深入探讨标题所提及的“fifo”(也称为命名管道),这是一种简单而有效的IPC机制,特别适合于那些需要进行双向同步通信且关系简单的进程。 FIFO,全称为First In First Out,即先进先出,这个概念通常用在...
在IT行业中,FIFO(First In First Out)和管道(PIPE)是进程间通信(IPC,Inter-Process Communication)的两种重要方式。FIFO是一种特殊的文件类型,它遵循先进先出的原则,允许不同进程通过文件系统进行数据交换...
在Linux操作系统中,进程间的通信(IPC,Inter-Process Communication)是多进程协作的重要手段,而FIFO(First In First Out,先进先出)是一种简单且常见的进程通信方式。FIFO,也被称为有名管道,允许没有亲缘...
在计算机科学领域,进程间通信(IPC,Inter-Process Communication)是多个进程...同时,FIFO作为进程间通信的一种手段,与其他IPC方法(如管道、消息队列、共享内存等)相辅相成,共同构成了丰富的进程通信工具集。
### Linux进程间通信(IPC) 进程间通信(InterProcess Communication,简称IPC)是操作系统中一个重要的概念,指在计算机系统中不同的进程之间进行数据交换或通信的方法。在Linux环境下,进程间通信支持多种机制,...
本文将深入探讨标题“ipc.rar_IPC_linux 进程_进程间通信_进程间通信ipc”所涉及的知识点,包括Linux下的管道(pipe)、进程以及进程间通信的基本概念、工作原理和应用实例。 首先,让我们理解什么是进程。在Linux...
3. **实现MAC框架**:在Linux内核层面上实现MAC框架,确保所有IPC通信都遵循定义好的访问策略。 4. **动态调整安全级别**:根据系统运行时的状态自动调整IPC对象的安全级别,进一步增强系统的灵活性和安全性。 ####...
8. **管道和FIFO**:与普通管道类似,但FIFO(First-In-First-Out)是一种全双工的通信方式,且无需亲缘关系的进程也能通信。 了解并熟练掌握这些IPC机制对于计算机专业人员至关重要,因为它们在设计并发应用程序、...
进程间通信(IPC,Inter-Process Communication)是操作系统中一种重要的机制,允许不同的进程之间交换信息,协同工作。本文将详细介绍五种常见的IPC技术:消息队列、共享内存、信号量、管道和FIFO。 首先,消息...
在进程间通信(IPC,Inter-Process Communication)中,一个进程将数据写入FIFO,另一个进程则读取这些数据。如果读写速度不匹配,FIFO的大小决定了可以存储多少未处理的数据。 2. **Linux中的FIFO**:在Linux系统...
在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)是多个进程之间进行数据交换的重要机制。本文将深入探讨几种常见的Linux IPC机制,包括管道(Pipes)、命名管道(Named Pipes, FIFOs)、信号...
它允许进程间通信(IPC),使得数据可以从一个进程写入,另一个进程读出,遵循FIFO规则。 2. **同步和信号量**:在多线程或多进程环境中,为了确保正确访问FIFO,可能需要使用同步机制,如互斥锁(mutex)或信号量...
在操作系统中,FIFO也被用于进程间的通信(IPC,Inter-Process Communication),允许两个或更多进程通过共享命名管道进行数据交换。在Linux系统中,FIFO通信方式是通过创建特殊的文件节点来实现的,这些节点称为...
FIFO是一种特殊的数据结构,广泛应用于操作系统中,特别是在进程间通信(IPC,Inter-Process Communication)时,如管道(pipe)。 描述中提到的"FIFO test code"是用于测试FIFO读写功能的应用程序。这个应用程序...
3. **管道通信**:在进程间通信(IPC)中,FIFO(也被称为命名管道)是一种同步通信机制。两个进程可以通过FIFO进行数据交换,数据的读取和写入遵循FIFO规则,即先写入的数据先被读出。 4. **硬件设备**:在硬件...