Manpages

NAME

fifo - 先 进 先 出 的 特 殊 文 件 , 命 名 管 道

描 述

一 个 先 进 先 出 ( FIFO) 的 特 殊 文 件 ( 一 个 命 名 管 道 ) 类 似 一 个 管 道 , 但 它 是 作 为 文 件 系 统 的 一 部 分 来 访 问 的 。 可 以 同 时 有 多 个 进 程 打 开 它 进 行 读 写 。 当 进 程 间 通 过 FIFO 交 换 数 据 时 , 内 核 会 在 其 内 部 传 送 所 有 数 据 , 而 不 会 写 入 文 件 系 统 。 即 , FIFO 特 殊 文 件 在 文 件 系 统 中 没 有 任 何 内 容 ; 文 件 系 统 中 的 文 件 条 目 只 是 作 为 一 个 参 照 点 而 已 , 使 得 进 程 可 以 用 文 件 系 统 中 的 一 个 名 字 对 其 进 行 访 问 。 内 核 会 为 至 少 有 一 个 进 程 打 开 了 的 FIFO 特 殊 文 件 维 护 单 独 一 个 管 道 对 象 。 在 数 据 经 由 FIFO 传 输 之 前 , FIFO 的 两 端 ( 读 和 写 ) 必 须 同 时 打 开 。 一 般 来 说 , 打 开 FIFO 的 行 为 会 阻 塞 , 直 至 另 一 端 也 被 打 开 。 一 个 进 程 可 以 使 用 非 阻 塞 模 式 打 开 一 个 FIFO。 这 种 情 况 下 , 即 使 写 端 没 有 打 开 , 打 开 读 端 还 是 会 成 功 。 但 是 , 如 果 读 端 没 有 打 开 , 打 开 写 端 会 失 败 , 并 且 得 到 一 个 ENXIO ( 设 备 或 地 址 不 存 在 ) 。 在 Linux 下 , 不 管 是 阻 塞 还 是 非 阻 塞 模 式 , 打 开 一 个 FIFO 用 作 同 时 读 写 都 会 成 功 。 POSIX 对 于 这 种 情 况 未 进 行 定 义 。 这 个 可 以 用 来 在 读 端 不 可 用 的 情 况 下 打 开 写 端 。 一 个 进 程 在 同 时 用 同 一 个 FIFO 的 两 端 来 实 现 自 己 和 自 己 通 信 的 时 候 要 特 别 小 心 , 应 避 免 出 现 死 锁 。

注 释

当 一 个 进 程 企 图 向 读 端 没 有 打 开 的 FIFO 写 数 据 的 时 候 , 进 程 会 收 到 一 个 SIGPIPE 信 号 。

FIFO 特 殊 文 件 可 以 用 mkfifo(3) 来 创 建 , 并 且 ls -l 会 对 其 添 加 一 个 特 殊 标 记 “p”进 行 指 示 。

参 见

mkfifo(1), open(2), pipe(2), sigaction(2), signal(2), socketpair(2), mkfifo(3), pipe(7)

本 页 面 原 英 文 版 是 Linux man-pages 项 目 4.09 版 的 一 部 分 。 如 需 了 解 这 个 项 目 的 描 述 、 汇 报 漏 洞 的 相 关 信 息 及 本 页 面 的 最 新 版 本 , 请 访 问 https://www.kernel.org/doc/man-pages/. 本 页 面 中 文 版 由 中 文 man 手 册 页 计 划 提 供 。 翻 译 人 员 : Boyuan Yang <073plan [AT] gmail.com> 获 取 日 期 : 2016-12-12 翻 译 日 期 : 2016-12-16 中 文 man 手 册 页 计 划 : https://github.com/man-pages-zh/manpages-zh