2012-08-01 22 views
8

non chiuderlo come duplicato, dal momento che ho un cambiamento sottile ma significativo dalle domande la classica:Capture uscita di processo esterno

E 'possibile acquisire l'output di un processo esterno (cioè stdout) in java, quando non ho creato il processo e tutto quello che so è il nome del processo?

Sono in esecuzione su Windows 7.

EDIT:

Se c'è un modo per farlo in altra lingua (C# \ C++), allora posso scrivere un programma "CaptureOutput" che cattura l'output, scrive su stdout e nel mio codice java per avviare "CaptureOutput" e leggere il suo stdput.

Brutto, ma potrebbe funzionare.

Quindi la risposta in altre lingue va bene anche per me.

+0

Lo stai eseguendo su unix? – amicngh

+0

@amicngh Sono in esecuzione su Windows 7 – sara

+0

hai accesso ad altri processi per l'attivazione da qualsiasi dove come java – amicngh

risposta

0

Avete un controllo su quando inizia il processo? In tal caso, è possibile avviare il processo e impostarne il pipe in un file che può essere letto o in un altro programma che può essere registrato in un database, visualizzatore eventi, ecc.

+0

No, non ho il controllo. Come ho detto: non ho creato il processo. – sara

+0

Potresti compilare questo altro processo? – RichardJohnn

+0

No :(, l'ho compilato .... – sara

1

Prima di tutto, lasciami dire che cosa stai chiedendo interruzioni di tutte le regole di isolamento dei processi. Se il processo non crea il processo di cui si desidera acquisire l'output e inoltre non si ha accesso per modificare il processo di chiamata (command shell? Service manager? Non è stato detto quale). Quindi la tua unica possibilità, ed è sottile, nel migliore dei casi, è iniettare un thread nel processo e mentre tutti gli altri thread sono sospesi, modificare lo stdout globale (e lo stderr?). Questo può essere fatto solo da un processo con privilegi di accesso completo al processo di destinazione. Effettuare tale chirurgia su un processo in esecuzione non è per i deboli di cuore.

+0

Un'altra alternativa estrema sarebbe quella di estrarre tutte le informazioni di runtime sul processo, uccidere l'originale e avviare la propria copia con il reindirizzamento desiderato. malvisto però ... –

+0

Altri ref attendono l'appassionato/disperato querant. –

+0

Una combinazione di SetStdHandle e Three-Ways-to-Inject-Your-Code-in-Another-Proces su codeproject potrebbe portarti lì. Devo sottolineare "potrebbe portarti lì". Scusa ma devo dire che questa è solo una cattiva idea. Trova una soluzione di file di log o parla con gli sviluppatori del programma o con il sysadmin o qualcosa del genere. –

0

Sotto Linux, controlla i meccanismi IPC del sistema operativo come code di messaggi, pipe, memoria condivisa e socket. Questi meccanismi consentono di Inter-process communication. Sebbene, se sei particolarmente interessato all'output di un programma, un work-around potrebbe semplicemente avere il primo processo che invia i dati su disco a un file e li legge con un processo separato. In questo modo, è possibile utilizzare più lingue per l'attività. Un semplice esempio potrebbe essere far scrivere a C++ alcuni dati su un file e utilizzare JAVA per leggere/utilizzare i dati, dato lo stesso file. Spero di essere venuto vicino a rispondere, se non del tutto.

1

Quello che stai cercando di fare è piuttosto pericoloso. Sarebbe molto facile rovinare accidentalmente la memoria del processo in cui stai cercando di entrare. Prova, prova, prova. Quindi prova altri. E buona fortuna - so che non vorrei doverlo fare.

Questo articolo - API Hooking - spiega come iniziare con ciò che si desidera (utilizzando C++). Dopo aver immesso il codice in un processo in esecuzione, esistono altre chiamate API di Windows per sostituire STDOUT (ad esempio SetStdHandle).

Problemi correlati