Cat

從 FIFO 管道列印而不干擾?

  • April 18, 2015

我有幾個 C 程序通過 Unix 中的 FIFO 命名管道來回發送消息,我想看看使用外部程序通過管道發生了什麼。問題是,如果我使用cat,它會在下一次我的程序呼叫write()並關閉管道後停止,從而中斷程序之間的通信……然後發生壞事。我不明白為什麼cat要關閉我的管道。編輯:實際上,我今天做了完全相同的事情,而不是關閉管道,它只是讓程序停止從中讀取。

那麼有沒有類似的東西,cat除了它根本不會干擾管道,只列印它看到的任何東西?

如果它是相關的,我在 C 中創建這樣的管道:

outs[i2/2] = open("/tmp/pipe_w", O_WRONLY);
ins[i2/2] = open("/tmp/pipe_r", O_RDONLY);

更新:這是一個終端範例。

我的程序在打開管道時列印此輸出:

Opened in pipe at /tmp/ai1In
Opened out pipe at /tmp/ai1Out

然後我在一個單獨的外殼中執行此操作:

admin$ cat /tmp/ai1Out
ai1

它看到消息“ai1”通過,然後什麼也沒有。讀取該管道的過程最終會永遠等待。我殺cat了,但管道仍然沒有被讀取。

更新 2:

cat [path] | tee [path]在某些情況下有效。它不會明顯干擾我的ai1Out管道,但會干擾ai1In. 差異必須是由於我的程式碼。無論如何,這意味著執行此命令會​​對使用管道的其他程序產生一些影響,這是我不想要的。當我嘗試讀取ai1Out時,我只看到了這一點,然後寫入該管道的程序在下一次write()呼叫時出錯:

admin$ cat /tmp/ai1In | tee /tmp/ai1In
]2,15,43,66,65,61,53,20,30,27,40,16,50,41,48[[[[[[[[

管道的定義是寫入其中的數據在另一端讀取。管道不會複製數據。在管道上讀取是一種破壞性操作。如果管道上有兩個讀取器,則每個字節將僅由一個讀取器讀取。

如果你想通過管道監視兩個程序之間的通信,你可以通過在程序tee 之間插入來實現。然後有兩個管道:一個從作者到讀者tee,一個從tee讀者。

mkfifo pipe_w pipe_r
writer >pipe_w
reader <pipe_r
<pipe_w tee pipe_r

您問題中的管道命名方案不一致,所以我不知道您到底嘗試了什麼。您似乎試圖將管道中的數據回饋回自身。那是行不通的:您創建了一個閉環,其中一些數據永遠返回到管道中(只有一些數據,因為無法預測哪些字節將返回到管道中,哪些字節將返回到原始讀者)。

如果兩個程序之間存在管道並且您無法更改管道,那麼監視它的最簡單方法是跟踪編寫器或讀取器程序。例如,如果 writer 程序的 PID 為 123,並且在文件描述符 4 上打開了管道,那麼在 Linux 下,您可以使用

strace -p123 -e write=4

引用自:https://unix.stackexchange.com/questions/197025