2016-10-08 5 views
-1

Ich möchte die Streams eines untergeordneten Prozesses steuern. Grundsätzlich wollte ich programmgesteuert ein Programm ausführen, Pipelines für Konsolenausgabe, Konsoleneingabe und Fehlerstream, aber auch Pipelines für Dateiströme erstellen. Zum Beispiel istUmleiten eines Datei-Stream eines untergeordneten Prozesses

int main (int, char * []) { 
    printf ("Hello, World!\n"); // I want to capture this, 
    FILE * fp = fopen ("test.txt", "r"); // send data through this stream, 
    fclose (fp); 
    fprintf (stderr, "Bye, World!\b"); // and finally capture this message. 
    return 0; 
} 

Mein Ziel ein Programm wie Microsoft Worte auszuführen und Lesedateidaten an das Programm zu senden. Ich erstelle eine Verschlüsselungssoftware, die Daten in einem Laufwerk speichert und bei Bedarf Daten sicher entfernt. SanDisk Vault-Sache hat einen ähnlichen Job gemacht, aber es scheint, als hätte es irgendwo auf der Festplatte eine temporäre Datei erstellt, aber ich möchte keine temporären Dateien erstellen.

Ich konsultierte Google, und Google zeigte popen Funktion und CreatePipe Funktion, aber diese Funktionen erstellt Pipelines für Stdout, Stdin und Stderr Streams aber keine Dateiströme.

Ich möchte sowohl Linux und Windows, aber Windows OS ist auf meiner ersten Liste.

+2

Könnten Sie einen von {linux, winapi} anstelle von beiden auswählen? – Brian

+0

Was versuchst du wirklich zu erreichen? Diese Frage klingt nach Ihrer Idee einer Lösung, ohne das wirkliche Problem, das Sie zu lösen versuchen, zu spezifizieren. – IInspectable

Antwort

1

Sie scheinen eine Kontrolle über die von bestimmten Prozessen vorgenommenen Dateioperationen zu haben. Eine allgemeine Lösung hierfür (in Windows) ist ein Dateisystem-Minifiltertreiber. Ein Treiber sieht alle Dateivorgänge, die von Prozessen (einschließlich des Kernels) ausgeführt werden, und kann sie im laufenden Betrieb ändern. Wenn X beispielsweise feststellt, dass X versucht, Daten in Datei Y zu schreiben, kann es die Daten verschlüsseln.

Die Entwicklung eines Dateisystem-Minifiltertreibers ist jedoch keine leichte Aufgabe. Ich erwarte, dass es schwieriger ist, eine Laufwerkverschlüsselungssoftware wie Bitlocker oder TrueCrypt zu entwickeln, da Dateisysteme wirklich komplizierte Biester sind.

1

Der Grund, warum es für einen übergeordneten Prozess einfach ist, stdin, stdout und stderr zu steuern, ist, weil sie die einzigen Ströme sind, die der untergeordnete Prozess nicht tatsächlich öffnet. Das heißt, aus der Sicht des Kindes waren sie bereits am Start, als es begann. Daher müssen die Eltern vor dem Start des Kindes nur die alternativen Versionen stdin, stdout und stderr bereitstellen. Dazu können Sie Pipes verwenden, aber Sie können auch Standarddateien verwenden.

Ich möchte die Ströme eines untergeordneten Prozesses steuern. Grundsätzlich wollte ich programmgesteuert ein Programm ausführen, Pipelines für Konsolenausgabe, Konsoleneingabe und Fehlerstream, aber auch Pipelines für Dateiströme erstellen.

Dies ist unklar. Um die Konsolenausgabe, Eingabe- und Fehlerströme zu ersetzen, können Sie die von Ihnen beschriebenen Rohrfunktionen verwenden. Was die "Streams" von Dateien angeht, werden sie vom Kindprozess selbst geöffnet und Sie haben nur wenig Kontrolle über diese, es sei denn, Sie können beeinflussen, welche Datei das Kind tatsächlich öffnet.

Sie können zum Beispiel erstellen named pipe namens test.txt (mit mkfifo) und Sie Kind-Prozess wird fälschlicherweise dieses Rohr verwenden, als ob es sich um eine Datei waren. Es verhält sich wirklich anders und das kann Probleme verursachen (seek ist verboten, schreiben dann zurücklesen hat nicht das erwartete Verhalten, etc ...), aber könnte mit einfachen Programmen arbeiten.

Sie können stattdessen eine geeignete Datei verwenden. Wenn Sie keine Festplattenzugriffe durchführen möchten, können Sie einen memory-mapped file verwenden, der auf den meisten Linux-Systemen problemlos in /dev/shm erstellt werden kann.

+1

Kann wirklich der Child-Prozess die Named Pipe behandeln, die Sie als Datei erstellt haben? Benannte Pipes AFAIK werden in einem anderen Namensraum platziert als normale Dateien (sie sind tatsächlich Dateien in ihrem eigenen Dateisystem). –

+0

Ich weiß nicht für Windows. Unter Linux verwende ich regelmäßig Named Pipes, um Programme zu manipulieren, die nicht stdin, sondern aus einer Datei lesen, um von stdin zu lesen. Beispiel: 'cp <(echo" foo ") file.txt' erstellt' file.txt' mit 'foo'. – Nonyme

Verwandte Themen