2011-04-28 15 views
8

Deseo crear un proceso utilizando el tiempo de ejecución de java: por ejemplo. Proceso proc = Runtime.getRuntime(). Exec ("cmd");java Proceso en tiempo de ejecución: compruebe si está esperando la entrada

Luego, quiero esperar de alguna manera el proceso hasta que esté en estado 'listo para la entrada', que verificará que ha terminado todo su trabajo. De todos modos sobre cómo hacerlo?

Una cosa que es posible es repetir "--- finished ---" y verificar si esta línea se escribió usando el stdin del proceso. Pero no me gusta la idea.

¿Hay algún enfoque mejor (más formal) para hacer esto?


Por cierto, necesito este efecto como lo describí. Quiero esperar antes de escribir nuevos comandos en el archivo por lotes.

Gracias.

Respuesta

6

¿Hay algún enfoque mejor (más formal) para hacer esto?

No. Java no proporciona ninguna forma de determinar si otro programa está esperando la entrada. De hecho, no creo que esto sea posible para determinar esto en absoluto (para Linux/UNIX) sin buscar en la memoria del kernel. (Y esa sería una muy mala idea ... OMI).

Lo mejor que puede hacer es verificar la salida del programa externo para ver si hay algún texto que indique que un lote acaba de terminar ... y espero que no obtenga un falso positivo. (O simplemente haga cola en los lotes sin esperar a que se completen, aunque parece que eso no será una solución para usted.)

6

Aquí hay algunas ideas. Ellos dependen de si el programa que está ejecutando espera leer o escribir desde stdin y stdout.

No es necesario esperar al estado "listo para recibir entrada" una vez que haya iniciado el proceso. Si necesita enviar comandos, use getOutputStream y escríbalos. Si el otro programa aún se está preparando, los datos que ha escrito se sentarán felizmente en un búfer hasta que el programa lea de stdin.

El uso de ProcessBuilder le permitirá controlar fácilmente los argumentos y el entorno. Ejemplo directo desde JavaDocs:

ProcessBuilder pb = new ProcessBuilder("myCommand", "myArg1", "myArg2"); 
Map<String, String> env = pb.environment(); 
env.put("VAR1", "myValue"); 
env.remove("OTHERVAR"); 
env.put("VAR2", env.get("VAR1") + "suffix"); 
pb.directory(new File("myDir")); 
Process p = pb.start(); 

Entonces, para leer o escribir:

OutputStream out = p.getOutputStream(); 
out.write("some useful data".getBytes()); 
out.flush(); 
3

Su pregunta parece ser una manera muy complicada de obtener el resultado final requerido.

En primer lugar, Java tiene la capacidad de escribir en archivos arbitrarios. ¿Por qué no usar esa capacidad de una sola vez? Llamar a color garantizará que la escritura se realice realmente ...

Si realmente necesita concurrencia por algún motivo, utilice un hilo durante un proceso. Luego, haz que el hilo haga lo que tiene que hacer y nada más. Haga que el hilo padre join() el hilo hijo. Cuando finalice el subproceso secundario, se reanudará el subproceso principal.

Finalmente, al llamar al available() en el flujo de salida o de entrada puede indicar que tiene muchos datos que puede leer Java antes de bloquear.Esto no es exactamente lo que quieres, pero puedo adaptarlo al trabajo, supongo.

Cuestiones relacionadas