3

したがって、端末(unix)で特定のCプログラムを実行するプロセスを作成するこのJavaプログラムがあり、Cプログラムで何かが発生したときに(終了前に)Javaプログラムに通知する必要があります。これどうやってするの?信号が必要になることはわかっていますが、この件についてはあまり経験がありません。

前もって感謝します!

編集:これは、プロセスを呼び出した後にJavaに加えた変更です:

            InputStream stdout = p.getInputStream();
            InputStreamReader isr = new InputStreamReader(stdout);
            BufferedReader br = new BufferedReader(isr);
            String line = null;
            System.out.println("<INPUT>");
            while ( (line = br.readLine()) != null)
                System.out.println(line);
            System.out.println("</INPUT>");
            int exitVal = p.waitFor();
            System.out.println("Process exitValue: " + exitVal);

Javaに通知したいときにCで行ったこと:

char buff[20];
size_t nbytes;
ssize_t bytes_written;
int fd;
strcpy(buf, "This is a test\n");
nbytes = strlen(buf);
bytes_written = write(1, buff, nbytes);

しかし、それを実行した後、私は得るだけです:

INPUT
/INPUT
Process exitValue: 0
4

4 に答える 4

4

方法の 1 つは、C プログラムの stdout を読み取ることです。

    Process p = Runtime.getRuntime().exec("c.exe");
    InputStream stdout = p.getInputStream();

CプログラムがJavaプログラムと通信できるようになりました

于 2012-12-16T17:30:41.637 に答える
1

Cプログラムを使用してソケットを作成し、Javaソケットサーバーに送信できます。goole で検索してサンプルを見つけることができます。

于 2012-12-16T17:28:57.963 に答える
1

Java プログラムとそれによって生成された別のプログラムとの間で通信する最も簡単な方法は、サブプロセスを起動するときに設定される FIFO ストリームを使用することです。したがって、たとえば、Runtime.exec()または を使用してサブプロセスを起動ProcessBuilderした場合、タイプ のオブジェクトがありますProcess。それを呼び出すことgetInputStream()で、プロセスの stdout にアクセスできます。

ネイティブ コードでは、シグナルを stdout に出力するだけで、Java プロセスで読み取ることができます。

于 2012-12-16T17:31:27.367 に答える
1

シグナルは Java で使用できますが、これは最適なメカニズムではありません。最初に、JNI、JMS、ソケット、RPC、またはその他のソリューションの使用を検討します。シグナルの問題は、多くの情報を送信することができず、正しく取得したりデバッグしたりするのが最も簡単なことです。

シグナル処理と Java の詳細については、

http://www.oracle.com/technetwork/java/javase/signals-139944.html

http://www.ibm.com/developerworks/java/library/i-signalhandling/ (リンク切れ)

http://ringlord.com/dl/Signals-in-Java.pdf

于 2012-12-16T17:31:54.217 に答える