0

したがって、ProcessBuilder を介して C プログラムを呼び出す Java プログラムがあり、何かが発生したときに Java プログラムに通知する C プログラムが必要です。Java prog の次のコードがあります。

    String cmd[] = //string to run the c program in the terminal, no probs here
    ProcessBuilder builder = new ProcessBuilder(cmd);
    builder.redirectErrorStream(true);
    Process process = builder.start();

    BufferedReader bufferedReader = new BufferedReader(new InputStreamReader(process.getInputStream()));
    System.out.println(bufferedReader.ready());
    System.out.println(bufferedReader.readLine());

特定の時点での c プログラムは、Java プログラムに何かを通知する必要があります。私は多くのことを試しました

char Buff[] = "output";
write(0, Buff, strlen(Buff)+1);
write(1, Buff, strlen(Buff)+1);
printf("output\n");

しかし、Javaプログラムにこれを読み取らせることはできません。得られる唯一の出力は

false
null
4

1 に答える 1

2

Javaプログラムは、バッファがフラッシュされるまで出力を表示しません。

のレベルでのバッファリングwriteはOSに依存し、同じOS内であっても、異なる種類のストリームには異なるデフォルトのバッファリングモードがある場合があります。Linuxでは、ドキュメントはwriteパイプへのaが他のプロセスですぐに読み取れることを意味しProcessBuilder、少なくともAndroidではパイプを使用します。

stdio.hこれを使用するfflushと、データがソケットまたはパイプに完全にプッシュされる可能性があります。たとえばfflush、Androidでこの目的のためにを使用して成功しましProcessBuilderた。

ラインバッファリングは、OSのもう1つの可能な選択肢です。この場合\n、メッセージに追加すると効果がある場合があります。

ちなみに、同じプログラムでのミキシングwriteprintfコールはトラブルを招きます。そして、すでに述べたように、write(0はへの書き込みの試みstdinでありstrlen(buf)+1、最後のゼロバイトがJavaプログラムに送信される原因になっていますが、これはあなたが望むものではない可能性があります。

于 2012-12-16T21:50:46.230 に答える