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,如果为 0,则保持无限循环mParam。但是,我发现无论传递给它的值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);
}

更新:

我发现了至少一个错误。由于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 回答