使用 Java 的进程构建器调用 C 程序

lec*_*rdo 0 c java

尝试使用 Java 的流程构建器调用 C 程序,但不知道在流程构建器调用中调用什么。

Process p = new ProcessBuilder("myCommand", "myArg").start();
Run Code Online (Sandbox Code Playgroud)

对于myCommandand myArg,我会用什么值替换它来运行 C 程序?我希望它调用的程序如下所示:

计算器.c:

#include <stdio.h>

int main ()
{
  int a = 4;
  int b = 2;
  int c = a + b;
  printf("Result: %d \n", c);
}
Run Code Online (Sandbox Code Playgroud)

Mic*_*nas 5

如果calculator.c 还没有被编译,你需要先编译它:

Process compile = new ProcessBuilder("gcc", "calculator.c").start();
Process execute = new ProcessBuilder("./a.out").start();
Run Code Online (Sandbox Code Playgroud)

任何相关的编译器标志(例如,-O-o calculator)也应包含在参数中。如果您确实重命名了可执行文件,那么您将希望对其进行更改./a.out

更好的方法(就几乎没有硬编码常量而言)是使用一些变量,例如:

String c_file = "calculator.c";
String output_exe = "calculator";
Process compile = new ProcessBuilder("gcc", "-o " + output_exe,  c_file).start();
Process execute = new ProcessBuilder("./" + output_exe);
Run Code Online (Sandbox Code Playgroud)

最后,您可能希望确保您的每个进程都没有错误地退出:

if (compile.getInputStream().read() == -1) {
    // that means something was written to stderr, and you can do something like
    System.out.error("ERROR!");
    System.exit(-1);
}
Run Code Online (Sandbox Code Playgroud)

正如@VinayDandekar 指出的那样,您也可以使用exitValue.

if (compile.exitValue() == -1) {
    // that means something was written to stderr, and you can do something like
    System.out.error("ERROR!");
    System.exit(-1);
}
Run Code Online (Sandbox Code Playgroud)