这里我们将java程序作为另一个java程序的输入。如果给定的程序包含任何无限循环,那么我想杀死输入程序的特定进程。
public String javaProgram(String strFilePath, String filename) throws Exception {
String path = strFilePath;
String fname = filename;
String output = "";
String totalPath = "javac" + " " + strFilePath + "/" + fname + ".java";
System.out.println("Total path" + totalPath);
String s = null;
String log = "";
String errorfile = strFilePath + "/" + fname + "_Error.txt";
try {
FileOutputStream fos = new FileOutputStream(errorfile, true);
Process pro = Runtime.getRuntime().exec(totalPath);
BufferedReader stdError = new BufferedReader(new InputStreamReader(pro.getErrorStream()));
boolean error = false;
log += "\n....\n";
while ((s = stdError.readLine()) != null) {
error = true;
fos.write(s.getBytes());
return "errortrue";
}
fos.close();
if (error == false) {
output = runProcess(path, fname);
return output;
}
if (output.equals("success")) {
return "sucess";
} else {
return "false";
}
} catch (Exception e) {
return "error";
}
}
private static String runProcess(String command, String filename) throws Exception {
String path1 = "java" + " " + "-cp" + " " + command + "/" + " " + filename;
System.out.println("Path" + path1);
String filepath = command + "/" + filename + "_output.txt";
System.out.println("filepath=============" + filepath);
System.out.println("Entered");
Process pro = Runtime.getRuntime().exec(path1);
String s = printLines(filepath, pro.getInputStream());
return s;
}
private static String printLines(String name, InputStream ins) throws Exception {
String line = null;
int count=0;
String strFilePath = name;
System.out.println("NAME" + name);
FileOutputStream fos = new FileOutputStream(strFilePath, false);
BufferedReader in = new BufferedReader(new InputStreamReader(ins));
while ((line = in.readLine()) != null) {
fos.write(line.getBytes());
System.out.println(name + " " + line);
// count++;
// if(count>10){
// break;
// }
}
fos.close();
return "success";
}
答案 0 :(得分:3)
计算机科学中一个众所周知的问题叫做暂停问题。这里涉及很多花哨的数学和有趣的讨论,但对你而言重要的部分是,已经证明,一般来说,一个程序是否会永远运行是不可能的。有些特定情况可以静态找到,例如while (true)
,但如果您的目标是拥有一个可以杀死无限运行程序的强大主管,那么您将遇到困难。
相反,我建议您采取实施超时的方法。为程序提供运行时间。如果它需要更多,杀死它。例如,如果您确定10分钟太长,则终止任何超过10分钟的程序。这应该更加实用。
答案 1 :(得分:0)
几乎在一个世纪以前就证明,一个给定的程序是否会停止(因此不包含无限循环)通常是不可判定的。