`

IPC 通信之 FIFO

阅读更多
    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。
  • 大小: 2.9 KB
  • 大小: 9.6 KB
分享到:
评论

相关推荐

    Linux下进程间通信FIFO演示程序

    标题中的"Linux下进程间通信FIFO演示程序"是一个用于展示如何在Linux环境下使用FIFO进行进程间通信的示例程序。通过这个示例,我们可以了解FIFO的基本用法和工作原理。 首先,FIFO是一种特殊的文件类型,它存在于...

    管道通信fifo程序

    管道通信,也称为命名管道(Named Pipe)或FIFO(First In First Out),是Linux和Unix-like操作系统中的一种进程间通信(IPC, Inter-Process Communication)机制。它允许不同进程之间进行单向或双向的数据传输,...

    Linux进程通信--FIFO(写)

    Linux进程间通信之FIFO,适用于任意进程间. 此C文件为FIFO的写端

    fifo.rar_fifo_fifo lin_fifo linux_linux fifo_进程间通信

    描述中的"linux下进程间通信方式之一的fifo读写源程序"提示我们,压缩包内的“fifo”文件很可能是实现FIFO读写操作的C语言源代码。通过分析和运行这些代码,我们可以了解如何在Linux环境中使用FIFO进行进程间的通信...

    Linux进程通信--FIFO(读)

    Linux进程间通信之FIFO,适用于任意两个进程间.此C文件件为读端.

    fifo进程间通信

    本文将深入探讨标题所提及的“fifo”(也称为命名管道),这是一种简单而有效的IPC机制,特别适合于那些需要进行双向同步通信且关系简单的进程。 FIFO,全称为First In First Out,即先进先出,这个概念通常用在...

    Linux 进程通信之FIFO的实现

    在Linux操作系统中,进程间的通信(IPC,Inter-Process Communication)是多进程协作的重要手段,而FIFO(First In First Out,先进先出)是一种简单且常见的进程通信方式。FIFO,也被称为有名管道,允许没有亲缘...

    FIFO.rar_进程间通信

    在计算机科学领域,进程间通信(IPC,Inter-Process Communication)是多个进程...同时,FIFO作为进程间通信的一种手段,与其他IPC方法(如管道、消息队列、共享内存等)相辅相成,共同构成了丰富的进程通信工具集。

    linux进程间通信--IPC

    ### Linux进程间通信(IPC) 进程间通信(InterProcess Communication,简称IPC)是操作系统中一个重要的概念,指在计算机系统中不同的进程之间进行数据交换或通信的方法。在Linux环境下,进程间通信支持多种机制,...

    ipc.rar_IPC_linux 进程_进程间通信_进程间通信ipc

    本文将深入探讨标题“ipc.rar_IPC_linux 进程_进程间通信_进程间通信ipc”所涉及的知识点,包括Linux下的管道(pipe)、进程以及进程间通信的基本概念、工作原理和应用实例。 首先,让我们理解什么是进程。在Linux...

    linuxIPC机制安全性的研究及改进

    3. **实现MAC框架**:在Linux内核层面上实现MAC框架,确保所有IPC通信都遵循定义好的访问策略。 4. **动态调整安全级别**:根据系统运行时的状态自动调整IPC对象的安全级别,进一步增强系统的灵活性和安全性。 ####...

    IPC.rar_IPC_进程间的通信

    8. **管道和FIFO**:与普通管道类似,但FIFO(First-In-First-Out)是一种全双工的通信方式,且无需亲缘关系的进程也能通信。 了解并熟练掌握这些IPC机制对于计算机专业人员至关重要,因为它们在设计并发应用程序、...

    5种进程间通信(IPC)技术

    进程间通信(IPC,Inter-Process Communication)是操作系统中一种重要的机制,允许不同的进程之间交换信息,协同工作。本文将详细介绍五种常见的IPC技术:消息队列、共享内存、信号量、管道和FIFO。 首先,消息...

    fifo.rar_fifo arm

    在进程间通信(IPC,Inter-Process Communication)中,一个进程将数据写入FIFO,另一个进程则读取这些数据。如果读写速度不匹配,FIFO的大小决定了可以存储多少未处理的数据。 2. **Linux中的FIFO**:在Linux系统...

    FIFO配合管道PIPE,实现FIFO传递数据,PIPE触发epoll,异步IO效果

    在IT行业中,FIFO(First In First Out)和管道(PIPE)是进程间通信(IPC,Inter-Process Communication)的两种重要方式。FIFO是一种特殊的文件类型,它遵循先进先出的原则,允许不同进程通过文件系统进行数据交换...

    ipc.rar_ ipc_IPC_linux ipc_pipes_进程间通信ipc

    在Linux操作系统中,进程间通信(IPC,Inter-Process Communication)是多个进程之间进行数据交换的重要机制。本文将深入探讨几种常见的Linux IPC机制,包括管道(Pipes)、命名管道(Named Pipes, FIFOs)、信号...

    fifo源代码

    它允许进程间通信(IPC),使得数据可以从一个进程写入,另一个进程读出,遵循FIFO规则。 2. **同步和信号量**:在多线程或多进程环境中,为了确保正确访问FIFO,可能需要使用同步机制,如互斥锁(mutex)或信号量...

    FIFO进程通信实验室.rar

    在操作系统中,FIFO也被用于进程间的通信(IPC,Inter-Process Communication),允许两个或更多进程通过共享命名管道进行数据交换。在Linux系统中,FIFO通信方式是通过创建特殊的文件节点来实现的,这些节点称为...

    FIFO.zip_fifo

    FIFO是一种特殊的数据结构,广泛应用于操作系统中,特别是在进程间通信(IPC,Inter-Process Communication)时,如管道(pipe)。 描述中提到的"FIFO test code"是用于测试FIFO读写功能的应用程序。这个应用程序...

    FIFO的程序及定义

    3. **管道通信**:在进程间通信(IPC)中,FIFO(也被称为命名管道)是一种同步通信机制。两个进程可以通过FIFO进行数据交换,数据的读取和写入遵循FIFO规则,即先写入的数据先被读出。 4. **硬件设备**:在硬件...

Global site tag (gtag.js) - Google Analytics