名前付きパイプにEOFを送信する - fifoクリーンアップ/乾燥

名前付きパイプにEOFを送信する - fifoクリーンアップ/乾燥

名前付きパイプから任意のプロセスを読み取る場合:

tail -f MYNAMEDPIPED 
cat MYNAMEDPIPE | someOtherProc

他の場所では、MYNAMEDPIPEDを名前で処理できます。 MYNAMEDPIPEDを削除するか、どういうわけか「乾燥」して尾のプロセスを停止する安全でクリーンな方法はありますか?

つまり

MYNAMEDPIPED.noMoreDataIsComingThroughSoPleaseStopTailingThis()

:)

コメントの1つを見ると、EOFをMYNAMEDPIPEに送信するように求められます。しかし、どうすればいいのかわかりません。

これは私が直面している困難を示しています。

http://comp.os.linux.questions.narkive.com/2AW9g5yn/sending-an-eof-to-a-named-pipe

ベストアンサー1

EOFキャラクターではないまた、いくつかの継続的な都市伝説が示すように、パイプを介して送信したり、記録の最後まで「供給」したりできる「イベント」でもありません。

これただEOFパイプ/FIFOの読み取り側で生成する方法(つまり、read(2)0を返す)は、書き込み側で開いているすべてのハンドルを閉じることです。

これは、書き込みモードで名前付きパイプを開いたすべてのプロセスと、ファイル記述子を継承したすべての子プロセスが終了するとfork()自動的に発生します[1]。

read(2)たとえば、パイプが読み取り/書き込みモードで開かれている場合、名前付きパイプのaが0を返すことはできません。そして

exec 7<>/path/to/fifo

この場合、パイプの両端にファイル記述子/ハンドルがあり、書き込み終了を閉じると読み取り終了も閉じてaがread(2)0を返すことができないためです(パイプはどのような半閉じもサポートしません)、ソケットは)とshutdown(2))をサポートしません。

SCM_RIGHTS[1] Unixソケットの補助メッセージを介してファイル記述子を受信するすべてのプロセス。


参考にしてくださいtail -f 定義によるとEOF読み取るファイルが通常のファイルであるか特殊なファイルであるかに関係なく、で終了しません。ファイル記述子へのオープンハンドルを保持しているすべてのプロセスを終了する1つの方法は次のとおりですfuser(1)

tail -f /path/to/fifo
...
> /path/to/fifo  # let any blocking open(2) through
fuser -TERM -k /path/to/fifo

/path/to/fifoこれは、(意図せずに)親から開いたハンドルを継承するプロセスも終了することに注意してください。

おすすめ記事