パイプは一時ファイルを書き込まなければなりませんか?


11

パイプを介して2つのプロセス間で大量のデータを転送すると、Linuxによって/ tmpディレクトリに一時ファイルが作成されることがわかりました。パイプ操作が成功すると、対応する一時ファイルはOSによって自動的に削除されます。しかし操作が失敗した場合、tmpファイルはそこに残ります。

何らかの理由で、ユーザーにデータをパイプ経由で転送する機会を与えたくないので、プログラムがクラッシュしてもハードディスクに何も残らないようにします。これどうやってするの?


3
私はそれがこれらのファイルを作成しているOSであることに非常に疑問を抱いています、特に私はそれがパイプ操作であることを疑います。

@ニール:非常に良い点です。 @ OP:受信側が受信したデータを標準入力にtmpファイルにキャッシュしていないことを確認していますか?それがあなた自身のコードでもオープンソースでもない場合、あなたはおそらくあなたの送信者からの出力をファイルにリダイレクトし、それを入力ストリームとして受信者プロセスに送ることによってチェックすることができます。 sender > filename それから receiver < filename。送信者または受信者のどちらかがそれを実行しているかどうかを確認するために、両方の操作中にtmpファイルをチェックします。

2
答えではありませんが、ここでパイプ処理に関する有用な情報をたくさん見つけました。&lt; slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible &gt; 。この人がどれほど権威があるのか​​わからないが、彼は具体的に mkfifo 作成されたパイプはバッファリングをまったくせず(まったく!)、ファイルを作成しません。
Carl Smotricz

1
@カールSmotricz:リンクが壊れているので、ここで: slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible

また、パイプがいっぱいになると(誰かが反対側から読み取るまで)パイプへの書き込みはブロックされます。

回答:


11
  1. パイプはデータをディスクに格納しません。 / bin / echo foo | grep barはファイルを作成しません。やってみる strace -f sh -c '/bin/echo foo | grep bar' パイプラインを実行しているときにシェルによって行われたすべてのシステムコールを表示します。 echo シェル組み込みですので、私はお勧めします /bin/echo シェルに実行可能ファイルを実行させる。

  2. /tmp ディスク上にある必要はありません。それはtmpfsにマウントすることができます(すなわち、仮想メモリによって裏打ちされます)。再起動すると空になることに注意してください。 /tmp その場合は、 /var/tmp あなたが残したいもののために。

あなたがしていることがファイルにデータを入れることであれば、それはパイプを使用していません。ファイルがfifoで、通常のファイルではない場合、それは単なる名前付きランデブーであり、データを含みません。調べるにはls -lを使います。

また、自分が所有しているプロセス内でパイプを通過しているものがユーザーに表示されないようにしたい場合は、ほとんどSOLです。 strace mmapされた共有メモリの読み書きを除いて、プロセスがプロセスの外で何かと相互作用することすべてを調べることができます。 ltrace さらに侵襲的です。もしあなたのプログラムがローカルユーザーがrootであるシステム上で動くなら、あなたはそれらを止めることはできません。 Unixでは、rootは何でもでき、目的のための強力なツールを持っています。


1

本当のパイプは、カーネル内のメモリのブロック、いくつかのプロセスによって読み書きされるバッファです。どこにもファイルは作成されません。

一部のアプリには、パイプの使用(速く、ディスクに当たらない、もう少し多くのメモリを使用する)と一時ファイルの使用(少し少ないメモリを使用する、一時ファイルを表示することができます)があります。 gcc おそらく他のものですが、そのようなアプリケーションの1つです。


0

ダーティーハック: 送信前にデータを暗号化する 両方のプロセスを変更できる場合は、受信時に復号化します。


実際には、これをダーティーハックとは呼びません。しかし、私はtmpファイルに興味があります。 OPは、カーネルが作成しているのは正しいのでしょうか。それともニールは正しいですか、それはパイプの一方の端またはもう一方の端です...

カーネルは一時ファイルを作成していません。一方、受信プロセスが一時ファイルを作成している可能性が非常に高いです。あなたがあなたの入力で探したいのなら、あなたが最初にそれをファイルに書く必要があるので、これはかなり一般的です。
larsks
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.