Procesos

Iniciado por rubcr, 18 Noviembre 2020, 11:36 AM

0 Miembros y 1 Visitante están viendo este tema.

rubcr

Hola buenas.
Me ha surgido una duda de como programar procesos en java.
Poniendo un ejemplo, ¿como se podría crear un proceso que ejerza como proceso padre y pida una frase por teclado y uno que ejerza como hijo y haga algo con esa frase como invertirla y la muestre?
He visto mucha documentación y no me llega a quedar claro.
Espero que alguien me ayude.
Un saludo.

MCKSys Argentina

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


rubcr

Cita de: MCKSys Argentina en 18 Noviembre 2020, 12:08 PM
Hola!

La respuesta que dí en este post puede ayudarte: https://foro.elhacker.net/java/programacion_de_procesos-t507778.0.html

Saludos!
Gracias por contestar y por tu aportación.  Me podrías ayudar con la sintaxis del programa, porque no me queda nada claro como implementarlo, entiendo lo que se expone pero no sé como aplicarlo en java

MCKSys Argentina

Cita de: rubcr en 18 Noviembre 2020, 12:17 PM
Gracias por contestar y por tu aportación.  Me podrías ayudar con la sintaxis del programa, porque no me queda nada claro como implementarlo, entiendo lo que se expone pero no sé como aplicarlo en java

Hola!

Has revisado las opciones del post en Stack Overflow? Hay varias. Dependiendo de la que elijas/prefieras, cada una tiene link con referencias a códigos de ejemplo de cómo implementar dichas opciones.

Saludos!

EDIT: De todas formas no soy programador Java per-se. Seguramente otros pueden darte algo más consiso.
MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."


K-YreX

Cita de: rubcr en 18 Noviembre 2020, 11:36 AM
Hola buenas.
Me ha surgido una duda de como programar procesos en java.
Poniendo un ejemplo, ¿como se podría crear un proceso que ejerza como proceso padre y pida una frase por teclado y uno que ejerza como hijo y haga algo con esa frase como invertirla y la muestre?
He visto mucha documentación y no me llega a quedar claro.
Espero que alguien me ayude.
Un saludo.
El funcionamiento es mucho más sencillo de lo que parece. A continuación te explico los pasos de lo que tienes que hacer:
PD: No te voy a dar el programa hecho. Solo te voy a dar un ejemplo de conexión de procesos en Java (que no es poco) y tú tendrás que hacer el resto.

  • Crear las dos clases ejecutables de manera independiente. Ambas clases deben tener su método main() y la clase hija (independiente) debe poder ejecutarse por si sola y funcionar correctamente. Esta última la vamos a crear con un BufferedReader para obtener los datos de la entrada estándar:
    Código (java) [Seleccionar]

    public class Independent {
      public static void main(String[] args) {
        try(BufferedReader br = new BufferedReader(new InputStreamReader(System.in))) { // try-with-resources para cerrar automaticamente el br
          System.out.println("Introduce un numero: ");
          int numero = Integer.parseInt(br.readLine());
          System.out.println(numero * 2);
        } catch(Exception e) {}
      }
    }


    Ahora tienes que hacer una clase dependiente que lo que hará será ejecutar la clase independiente y mandarle la entrada como si la hubiésemos introducido directamente desde el teclado, después recibirá su salida y la mostrará:
    Código (java) [Seleccionar]

    public class Dependent {
      public static void main(String[] args){
        ProcessBuilder pb = new ProcessBuilder("java", "Independent"); // comando para lanzar la otra clase como si se hiciese desde linea de comandos
        try {
          Process p = pb.start(); // iniciamos el proceso
          OutputStream os = p.getOutputStream(); // redireccionamos su ENTRADA a os. Se utiliza output porque se entiende que es la salida del padre
          BufferedReader br = new BufferedReader(new InputStreamReader(p.getInputStream())); // redireccionamos su SALIDA (que es la entrada para el padre)
          os.write((4 + "\n").getBytes()); // Simulamos que hemos introducido un 4 por teclado y le hemos dado al enter
          os.flush(); // hacemos que los bytes anteriores se escriban en el flujo. Si no hacemos esto se quedaran en un buffer temporal y no continuara
          // Ahora el programa hijo que ha sido lanzado hace un rato acaba de recibir el flujo anterior como si lo hubiesemos introducido por teclado
          // Ahora "ha mostrado" el resultado (8). Tenemos que recoger su salida mediante br:
          br.readLine(); // Leemos la primera linea de su salida que no interesa (porque es: "Introduce un numero: \n")
          int doble = Integer.parseInt(br.readLine()); // Guardamos el 8 que se habria mostrado por pantalla
          System.out.println("El resultado es: " + doble);
        } catch(Exception e){}
        // ...ahora habria que cerrar flujos y demas...
      }
    }


  • Si trabajas desde un IDE es posible que tengas problemas con la instanciación del ProcessBuilder pues tendrás que utilizar un comando de ejecución algo más complejo.
  • Si trabajas en Windows y tu IDE está configurado en UTF-8 tendrás que añadir la codificación a la instrucción.

    A partir de aquí te toca continuar a ti y si tienes algún otro problema siempre puedes preguntar pero adjunta lo que tengas hecho. :-X
Código (cpp) [Seleccionar]

cout << "Todos tenemos un defecto, un error en nuestro código" << endl;

rub'n

tal cual, como dicen, y aqui mismo en el foro, hay temas bastante sobre como ejecutar procesos bash con java.


rubn0x52.com KNOWLEDGE  SHOULD BE FREE!!!
If you don't have time to read, you don't have the time (or the tools) to write, Simple as that. Stephen