Vull que el meu programa Java es comuniqui amb un programa C. Aquest és només un exemple simple, però no puc fer-ho. Se suposa que el programa Java executa el programa C i escriu en el seu flux d’entrada. El programa C hauria de veure això i escriure en stdout com a resposta. Finalment, el programa Java hauria de llegir aquesta resposta des de la sortida estàndard de el programa C i imprimir-la a la pantalla.
A l’executar el programa C des de la línia d’ordres, obtinc el comportament desitjat. No obstant això, quan s’executa des del programa Java, simplement es “penja” i no fa res. El programa Java sembla haver escrit el seu missatge al stdin de el programa C, però aquest missatge no es veu en el programa C.
Configureu el programa C perquè escrigui el missatge que llegeix a l’arxiu sol per comprovar que sí llegeix el missatge, i no ho fa.
aquí hi ha el programa C:
#include <stdio.h>#include <string.h>void hello();void wrong();int main() { char buff; /* 1. read stdin */ fscanf(stdin, "%s", buff); /* side effect - if message was received it should be printed to file */ FILE *fp = fopen("file.txt", "w"); fprintf(fp, "%s", buff); fclose(fp); /* 2. depending on message, write something to stdout */ if(strcmp(buff, "hello") == 0) { hello(); } else { wrong(); }}void hello() { printf("Hello World!");}void wrong() { printf("WRONG!");}
i aquí hi ha el programa Java:
import java.io.*;public class Main { public static void main(String args) { try { // 1. run C program Process proc = Runtime.getRuntime().exec("./hello"); InputStream in = proc.getInputStream(); OutputStream out = proc.getOutputStream(); // 2. write 'hello' to 'hello' program writeToProc(out, "hello"); // 3. read response readFromProc(in); } catch(Exception e) { e.printStackTrace(); } } // write message to process public static void writeToProc(OutputStream out, String msg) throws IOException { byte buff = msg.getBytes(); out.write(buff); out.flush(); System.out.println("done writing: " + new String(buff)); } // read stdin of process public static void readFromProc(InputStream in) throws IOException { byte buff = new byte; int read = in.read(); for(int i=0; read != -1; i++) { read = in.read(); buff = (byte) read; } String str = new String(buff); System.out.println("proc says: " + str); }}
Quan executo Main, obtinc el següent resultat:
$ java Main done writing: hello
I després només un cursor parpellejant i l’arxiu “file.txt” no s’escriu, el que indica que el programa C no va llegir “hola” de stdin.
Aquest és un exemple simple, així que suposo que m’estic perdent cosa simple o m’equivoco d’alguna manera.