0

プロセスを開始し、整数を渡して、出力される値を取得するのを待ちます。私は次のことを試しました(Windowsで):

public class Example {

    public static Boolean call() throws IOException {
        String mFilename = "f.exe";
        int mParam = 0;
        Process p = Runtime.getRuntime().exec(mFilename);
        BufferedReader input = new BufferedReader
                (new InputStreamReader(p.getInputStream()));
        BufferedWriter output = new BufferedWriter
                (new OutputStreamWriter(p.getOutputStream()));
        output.write(mParam);
        output.flush();
        char retVal = (char) input.read();
        return !(retVal == '0');
    }

    public static void main(String[] args) throws IOException {
        System.out.println(call());
    }
}

mFilename実行可能ファイルへのパスです。このプロセスは、正の入力の場合は1、負の場合は0を返し、mParamが0の場合は無限ループのままです。ただし、どの値を渡してもretVal常に1であることがわかりました。何が間違っているのでしょうか。

数分前に質問を削除してすみません。問題はあると思いましたretValが、このコードの問題はそれだけではなかったようです。

C ++で記述された子プロセス:

#include <iostream>
#include <Windows.h>

bool f(int x)
{
    if (x)
        return x > 0;

    while (1)
        Sleep(100);
}

int main()
{
    int x;
    std::cin>>x;
    std::cout<<f(x);
}

アップデート:

エラーの少なくとも1つを見つけました。mParamは整数であり、オプションの記号と数字の束で構成され、文字output.writeを書き込むため、整数を文字配列として書き込む必要があります。

char[] arr = String.valueOf(mParam).toCharArray();
output.write(arr);

ただし、入力に関係なく、この修正プログラムがハングした後

char retVal = (char) input.read();
4

1 に答える 1

0

さて、解決策は非常に単純であることが判明しましたstd::cin。整数を正常に読み取るために改行が必要でした。結果のコードは次のとおりです。

public Boolean call() throws IOException, InterruptedException, ExecutionException, TimeoutException {
    Process p = Runtime.getRuntime().exec(mFilename);
    final BufferedReader input = new BufferedReader
            (new InputStreamReader(p.getInputStream()));
    final BufferedWriter output = new BufferedWriter
            (new OutputStreamWriter(p.getOutputStream()));
    output.write(Integer.toString(mParam));
    output.newLine();
    output.flush();

    ExecutorService executor = Executors.newFixedThreadPool(2);
    Callable<Character> readTask = new Callable<Character>() {
        @Override
        public Character call() throws Exception {
            return Character.valueOf((char)input.read());
        }
    };
    Future<Character> future = executor.submit(readTask);
    char readVal;
    try {
        readVal = future.get(3L, TimeUnit.SECONDS);
    } finally {
        p.destroy();
        executor.shutdownNow();
    }

    return !(readVal == '0');
}

「無限ループ」の場合のシナリオのサポートを追加したことに注意してください。3秒以内にstdoutから出力を取得できない場合は、例外をスローして子プロセスを終了します。関数は何らかの結果を返す必要があるため、ここでは例外を処理しませんが、無限ループの場合、返す結果はありません。

于 2012-12-14T21:12:32.733 に答える