Ich habe festgestellt, dass, wenn ich eine große Datenmenge zwischen zwei Prozessen über Pipe übertrage, 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 der Vorgang jedoch fehlschlägt, bleibt die tmp-Datei dort.
Aus irgendeinem Grund möchte ich nicht, dass der Benutzer die Möglichkeit hat, die von mir über Pipe übertragenen Daten abzurufen. Daher möchte ich nicht, dass noch etwas auf der Festplatte verbleibt, selbst wenn mein Programm abstürzt. Wie kann ich das machen?
sender > filename
Dannreceiver < filename
. Ich würde während beider Operationen nach der tmp-Datei suchen, um zu sehen, ob entweder der Absender oder der Empfänger dies tut.mkfifo
erstellte Pipe niemals (überhaupt!) Puffert und niemals Dateien erstellt.Antworten:
Pipes speichern keine Daten auf der Festplatte. / bin / echo foo | Die Grep-Leiste 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 eine Pipeline ausgeführt wird.echo
ist eine eingebaute Shell, daher habe ich vorgeschlagen/bin/echo
, die Shell als ausführbare Datei auszuführen./tmp
muss nicht auf der Festplatte sein. Es kann auf tmpfs gemountet werden (dh durch virtuellen Speicher gesichert). Beachten Sie, dass/tmp
in diesem Fall ein Neustart leer ist. Verwenden/var/tmp
Sie ihn daher für alles, was Sie in der Nähe lassen möchten.Wenn Sie Daten in eine Datei einfügen, wird keine Pipe verwendet. Wenn es sich bei der Datei um eine FIFO-Datei handelt, nicht um eine reguläre Datei, handelt es sich nur um ein benanntes Rendezvous, das keine Daten enthält. Verwenden Sie ls -l, um dies herauszufinden.
Und beachten Sie, dass Sie, wenn Sie verhindern möchten, dass Benutzer sehen, was in Prozessen, die sie besitzen, durch Pipes läuft, so ziemlich SOL sind, da Sie
strace
alles überprüfen können, was ein Prozess tut, der mit etwas außerhalb des Prozesses interagiert, außer dem Lesen / Schreiben von mmapped shared Erinnerung.ltrace
ist noch invasiver. Wenn Ihr Programm auf Systemen ausgeführt wird, auf denen der lokale Benutzer root hat, können Sie diese überhaupt nicht stoppen. Unter Unix kann root alles und verfügt über leistungsstarke Tools für diesen Zweck.quelle
Eine echte Pipe ist ein Speicherblock im Kernel, ein Puffer, der von einigen Prozessen gelesen / geschrieben wird. Es werden nirgendwo Dateien erstellt.
Einige Apps verfügen über Optionen, die zwischen der Verwendung von Pipes (schneller, keine Festplatte, benötigt etwas mehr Speicher) und der Verwendung von temporären Dateien (benötigt etwas weniger Speicher, sodass Sie möglicherweise die temporären Dateien sehen können, ein bisschen langsamer) wechseln.
gcc
ist eine solche Anwendung, obwohl wahrscheinlich andere sind.quelle
Dirty Hack: Verschlüsseln Sie die Daten vor dem Senden und entschlüsseln Sie sie beim Empfang, wenn Sie beide Prozesse ändern können ...
quelle