Unixでは、FIFOという名前のパイプを介してメッセージを送受信する複数のCプログラムがあり、外部プログラムを使用してパイプで何が起こっているかを確認したいと思います。問題は、を使用すると、次のプログラム呼び出しの後に停止し、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[[[[[[[[
ベストアンサー1
パイプの定義は、パイプに書き込まれたデータをもう一方の端から読み取ることです。パイプはデータをコピーしません。パイプを読むことは破壊的な仕事です。パイプに2つのリーダーがある場合、各バイトはリーダーの1つだけを読み取ります。
パイプを介して2つのプログラム間の通信を監視するには、次のように挿入します。tee
〜サイプログラム。その後、2つのパイプがあります。一つは作者から読者へ、もうtee
一つはtee
作者から読者につながる。
mkfifo pipe_w pipe_r
writer >pipe_w
reader <pipe_r
<pipe_w tee pipe_r
あなたの質問のパイプ命名システムが一貫していないため、正確に何を試したのかわかりません。パイプからそれ自体にデータを再供給したいようです。これはうまくいきません。一部のデータがパイプに永遠に戻る閉ループを作成します(どのバイトがパイプに戻るか、どのバイトが元のリーダーに戻るかを予測することができないため、部分データのみ)。
2つのプロセスの間にパイプがあり、パイプを変更できない場合は、それらを監視する最も簡単な方法はビルダーまたはリーダープロセスを追跡することです。たとえば、書き込みプロセスの PID が 123 で、ファイル記述子 4 でパイプが開いている場合、Linux では以下を使用できます。
strace -p123 -e write=4