我最近一直在开发一个程序,该程序从 Java 程序编译并运行 C++ 程序,我已经让一切基本正常工作(或至少据我所知),但后来我注意到一些东西被打印到错误流中:
cdog5000@srv3:~$ java -Xmx50m -jar main2.jar
Running Command: sudo g++ --static -o "/home/cdog5000/cody.out" "/home/cdog5000/cody.cpp"
Err: g++: "/home/cdog5000/cody.cpp": No such file or directory
Err: g++: no input files
cdog5000@srv3:~$ ls -l
total 4548
-rwxr-xr-x 1 cdog5000 cdog5000 1297588 Feb 3 23:11 a.out
-rwxr-xr-x 1 cdog5000 cdog5000 7978 Feb 2 04:39 cody
-rw-r--r-- 1 cdog5000 cdog5000 106 Feb 4 02:09 cody.cpp
-rwxr-xr-x 1 cdog5000 cdog5000 1297357 Feb 4 02:09 cody.out
-rw-r--r-- 1 root root 410433 Feb 4 02:48 log.txt
-rwxr-xr-x 1 cdog5000 cdog5000 801088 Feb 1 05:24 main.jar
-rw-r--r-- 1 cdog5000 cdog5000 804802 Feb 4 02:49 main2.jar
drwxr-xr-x 3 cdog5000 cdog5000 4096 Feb 3 23:11 sandbox
cdog5000@srv3:~$ sudo g++ --static -o "/home/cdog5000/cody.out" "/home/cdog5000/cody.cpp"
正如你所看到的,如果我通过 SSH 而不是 Java 代码来实现它,它会起作用吗?
Java代码:
public static Exec exec(String cmd){
Exec exec = new Exec(cmd);
try {
long current = System.currentTimeMillis();
Process proc = Runtime.getRuntime().exec(cmd);
exec.setReturnValue(proc.waitFor());
exec.setRunTime(System.currentTimeMillis() - current);
BufferedInputStream bos = new BufferedInputStream(proc.getInputStream());
byte b[] = new byte[1024];
String content = "";
while(bos.read(b) != -1) {
content += new String(b);
}
exec.setStdIn(content.split("\n"));
content = "";
bos = new BufferedInputStream(proc.getErrorStream());
while(bos.read(b) != -1) {
content += new String(b);
}
exec.setStdErr(content.split("\n"));
} catch (Exception e) {
e.printStackTrace();
}
return exec;
}
感谢您的帮助,非常感谢!
Err: g++: "/home/cdog5000/cody.cpp": No such file or directory
正在告诉你问题所在。
您的一级报价过多,因此您正在寻找"/home/cdog5000/cody.cpp"
而不是/home/cdog5000/cody.cpp
.
The Runtime.exec 文档 http://download.oracle.com/javase/1.5.0/docs/api/java/lang/Runtime.html#exec%28java.lang.String%29 says:
更准确地说,使用通过调用 new StringTokenizer(command) 创建的 StringTokenizer 将命令字符串分解为标记,而无需进一步修改字符类别。然后,标记生成器生成的标记按照相同的顺序放置在新的字符串数组 cmdarray 中。
这意味着它只在空格上分割,它不像 shell 那样处理双引号。
许多语言都有两个函数,一个称为exec
它逐字运行命令,并且system
它将字符串传递给 shell,在 shell 中它将分割单词并扩展通配符。
我看不到system
用Java调用,所以我想你必须使用exec(String[] cmdarray)
而不是exec(String command)
.
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)