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