Muss Pipe eine temporäre Datei schreiben?

6347
solotim

Ich habe festgestellt, dass bei der Übertragung einer großen Datenmenge zwischen zwei Prozessen über Pipe eine temporäre Datei von linux im Verzeichnis / tmp erstellt wird. Wenn der Pipe-Vorgang erfolgreich ist, wird die entsprechende temporäre Datei vom Betriebssystem automatisch entfernt. Wenn die Operation fehlgeschlagen ist, bleibt die tmp-Datei dort.

Aus irgendeinem Grund möchte ich nicht, dass der Benutzer die Möglichkeit hat, die Daten zu erhalten, die ich über Pipe übertragen habe. Ich möchte also nicht, dass auf der Festplatte noch etwas übrig bleibt, selbst wenn mein Programm abstürzt. Wie kann ich das machen?

10
Ich bezweifle sehr, dass das Betriebssystem diese Dateien erstellt. Ich bezweifle, dass es sich um den Pipe-Vorgang handelt. vor 14 Jahren 3
@Neil: Sehr guter Punkt. @OP: Sind Sie sicher, dass der Empfänger die auf stdin empfangenen Daten nicht in der tmp-Datei speichert? Wenn es sich nicht um Ihren eigenen Code und nicht um Open Source handelt, können Sie dies wahrscheinlich überprüfen, indem Sie Ihre Ausgabe von Ihrem Sender in eine Datei umleiten und diese dann als Eingangsstrom an den Empfängerprozess senden, z. B .: `sender> filename` und dann` receiver < Dateiname`. Ich würde während beider Operationen nach der tmp-Datei suchen, um zu sehen, ob der Sender oder Empfänger dies tut. vor 14 Jahren 0
Keine Antwort, aber ich habe hier viele nützliche Informationen zum Rohrhandling gefunden: . Ich weiß nicht, wie maßgebend diese Person ist, aber er erwähnt ausdrücklich, dass eine von `mkfifo` erstellte Pipe niemals puffert (überhaupt!) Und niemals Dateien erstellt. Carl Smotricz vor 14 Jahren 2
@Carl Smotricz: Link ist gebrochen, also hier: http://slacy.com/blog/2008/12/on-mkfifo-and-doing-the-impossible/ vor 14 Jahren 1
Auch das Schreiben in eine Pipe wird blockiert, wenn die Pipe zu voll ist (bis jemand vom anderen Ende liest). vor 14 Jahren 0

3 Antworten auf die Frage

11
Peter Cordes
  1. Pipes speichern keine Daten auf der Festplatte. / bin / echo foo | grep bar erstellt keine Dateien. Versuchen Sie strace -f sh -c '/bin/echo foo | grep bar', alle Systemaufrufe anzuzeigen, die von einer Shell ausgeführt werden, wenn Sie eine Pipeline ausführen. echoist eine eingebaute Shell, daher schlug ich vor /bin/echo, die Shell als ausführbare Datei auszuführen.

  2. /tmpmuss nicht auf der Festplatte sein. Es kann auf tmpfs gemountet werden (dh durch virtuellen Speicher gesichert werden). Beachten Sie, dass ein Neustart /tmpin diesem Fall leer ist. Verwenden /var/tmpSie also alles, was Sie in der Nähe haben möchten.

Wenn Sie Daten in eine Datei schreiben, wird keine Pipe verwendet. Wenn es sich bei der Datei um eine FIFO-Datei handelt, keine reguläre Datei, handelt es sich lediglich um einen Rendezvous mit Namen, der keine Daten enthält. Benutze ls -l um es herauszufinden.

Beachten Sie, dass Sie, wenn Sie die Benutzer daran hindern möchten, zu sehen, was durch die Pipes in Prozessen geht, die sie besitzen, so ziemlich SOL sind, da Sie stracealles überprüfen können, was ein Prozess tut, der mit etwas außerhalb des Prozesses interagiert, außer dem Lesen / Schreiben von Mapped Shared Erinnerung. ltraceist noch invasiver. Wenn Ihr Programm auf Systemen läuft, auf denen der lokale Benutzer root hat, können Sie diese überhaupt nicht anhalten. Auf Unix kann root alles tun und verfügt über leistungsstarke Tools für diesen Zweck.

1
Rich Homolka

Eine echte Pipe ist ein Speicherblock im Kernel, ein Puffer, der von einigen Prozessen gelesen / geschrieben wird. Es werden keine Dateien erstellt.

Einige Apps verfügen über Optionen zum Wechseln zwischen Pipes (schneller, keine Festplatte schlagen, beansprucht etwas mehr Speicher) und Temp-Dateien (benötigt etwas weniger Speicher, ermöglicht es Ihnen möglicherweise, die Temp-Dateien zu sehen, eine Berührung langsamer). gccist eine solche Anwendung, obwohl es wahrscheinlich andere sind.

0
Senad Uka

Dirty Hack: Verschlüsseln Sie die Daten vor dem Senden und entschlüsseln Sie sie beim Empfang, wenn Sie beide Prozesse ändern können.

Würde es nicht als schmutzigen Hack bezeichnen, eigentlich: Wenn die Daten sensibel sind, scheint eine geeignete Lösung zu sein. Ich bin aber neugierig auf die tmp-Datei. Ist das OP richtig, dass der Kernel es erstellt? Oder hat Neil recht und es ist das eine Ende der Pfeife oder das andere ... vor 14 Jahren 0
Der Kernel erstellt keine temporäre Datei. Auf der anderen Seite ist es sehr wahrscheinlich, dass der Empfangsprozess eine temporäre Datei erstellt. Dies ist ziemlich häufig, denn wenn Sie in Ihrer Eingabe suchen möchten, müssen Sie sie zuerst in eine Datei schreiben. larsks vor 14 Jahren 0