Erfassung der externen Prozessausgabe

8

Schließen Sie es nicht als Duplikat, da ich eine subtile aber signifikante Änderung von den ähnlichen Fragen habe:

Ist es möglich, die Ausgabe eines externen Prozesses (d. h. stdout) in Java zu erfassen, , wenn ich den Prozess nicht erstellt habe und alles, was ich weiß, ist der Prozessname?

Ich laufe auf Windows 7.

BEARBEITEN:

Wenn es eine Möglichkeit gibt, es in einer anderen Sprache zu tun (C # \ C ++), kann ich ein "CaptureOutput" Programm schreiben, das die Ausgabe erfasst, in stdout schreibt und in meinem Java-Code "CaptureOutput" startet und liest sein Stand.

Hässlich, aber könnte funktionieren.

Also antworte in anderen Sprachen auch bei mir in Ordnung.

    
sara 01.08.2012, 13:20
quelle

4 Antworten

1

Was Sie versuchen, ist ziemlich gefährlich. Es wäre sehr leicht, versehentlich den Speicher des Prozesses zu verfälschen, in den Sie hinein wollen. Testen, testen, testen. Dann teste etwas mehr. Und viel Glück - ich weiß, ich würde das nicht abziehen müssen.

Dieser Artikel - API Hooking - erklärt, wie Sie mit dem beginnen, was Sie wollen (mit C ++). Sobald Sie Ihren Code in einen laufenden Prozess eingefügt haben, gibt es andere Windows-API-Aufrufe zum Ersetzen von STDOUT (z. B. SetStdHandle ).

    
ngreen 27.09.2012 19:54
quelle
1

Zuerst möchte ich sagen, dass das, was Sie fragen, alle Regeln der Prozessisolierung durchbricht. Wenn Ihr Prozess nicht den Prozess erstellt, dessen Ausgabe Sie erfassen möchten, und Sie haben auch keinen Zugriff, um den aufrufenden Prozess zu ändern (Befehlsshell? Service Manager? Sie haben nicht gesagt, was). Dann ist Ihre einzige Chance, und es ist im besten Fall eine dünne, einen Thread in den Prozess zu injizieren und während alle anderen Threads suspendiert sind, ändern Sie den globalen stdout (und stderr?). Dies kann nur durch einen Prozess mit vollen Zugriffsrechten für den Zielprozess erfolgen. Eine solche Operation in einem laufenden Prozess durchzuführen ist nichts für schwache Nerven.

    
dex black 12.08.2012 00:03
quelle
0

Haben Sie eine Kontrolle darüber, wann der Prozess beginnt? Wenn dies der Fall ist, könnten Sie den Prozess starten und ihn in eine Datei schreiben lassen, die gelesen werden kann, oder in ein anderes Programm, das Sie schreiben, das es in einer Datenbank, Ereignisanzeige usw. aufzeichnen könnte.

    
RichardJohnn 02.08.2012 12:38
quelle
0

Überprüfen Sie unter Linux die IPC-Mechanismen des Betriebssystems, z. B. Nachrichtenwarteschlangen, Pipes, Shared Memory und Sockets. Diese Mechanismen ermöglichen Kommunikation zwischen Prozessen . Wenn Sie jedoch besonders an der Ausgabe eines Programms interessiert sind, könnte ein Work-Around den ersten Prozess nur dazu bringen, die Daten auf Festplatte auf eine Datei auszugeben und mit einem separaten Prozess zu lesen. Auf diese Weise können Sie mehrere Sprachen für die Aufgabe verwenden. Ein einfaches Beispiel wäre, C ++ einige Daten in eine Datei schreiben zu lassen und JAVA zu verwenden, um die Daten zu lesen oder zu verwenden, wenn die gleiche Datei verwendet wird. Hoffe, ich kam fast zur Antwort, wenn überhaupt.

    
Ryan 15.09.2012 11:59
quelle

Tags und Links