從 FIFO 管道列印而不干擾?
我有幾個 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