ProcessBuilder로 만든 프로세스에는 표준 입력, 출력 및 오류 스트림이 있으며 입력 스트림에 쓰거나 출력 스트림에서 읽지 않으면 응답이 중지됩니다.자세한 내용은 다음 질문을 참조하십시오
Why does process hang if the parent does not consume stdout/stderr in Java?
Java ProcessBuilder: Resultant Process Hangs
그것대로 실행하는 사용자 중 하나가를 시작하는 데 필요한 권한을 가지고 있지 않기 때문에 프로세스가 시작되지 않습니다 것도 가능하다 또는 일부 DLL을로드 할 수 없거나 다른 이유로 인해 발생할 수 있습니다.
Unable to use taskkill.exe from a Java process
나는 프로그램의 수정 된 버전을 만들었습니다. 명령 줄에서 실행하면 exe 파일을 실행할 수 있지만 Eclipse 프로젝트에서 동일한 작업을 수행하면 프로세스가 종료 코드 -1073741515를 반환합니다. 위의 질문에 따르면 "응용 프로그램 제대로 초기화하지 못했습니다. " 내 생각에 Eclipse가 exe를 실행하기 위해 java를 호출하는 환경 (exe는 실행중인 사용자, PATH 설정 방법 등)과 exe의 모든 종속성을 사용할 수 있는지 조사해야한다고 생각합니다 (어떤 DLL이이 작업을 수행합니까? 에 의존하여) 성공적으로 실행되지 않는 이유를 판별하십시오.
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.io.StringWriter;
import java.io.Writer;
public class Runs_An_Exe {
public static void main(String[] args) throws Exception {
ProcessBuilder pb = new ProcessBuilder("c:/cygwin/tmp/a.exe");
pb.redirectErrorStream(true); // redirect stderr to stdin
Process p = pb.start();
final StringWriter writer = new StringWriter();
final InputStreamReader isr = new InputStreamReader(p.getInputStream());
// capture all output from the process
new Thread(new Runnable() {
@Override public void run() {
readAll(isr, writer);
}
}).start();
// wait for it to finish, and display the exit code
int result = p.waitFor();
System.out.println("result: " + result);
// display any output from the process
System.out.println(writer.toString());
}
private static void readAll(Reader reader, Writer writer) {
try {
char[] buffer = new char[8192];
int n = 0;
while (-1 != (n = reader.read(buffer))) {
writer.write(buffer, 0, n);
}
} catch (IOException e) {
e.printStackTrace();
}
}
}
(내가 사용 a.exe를가 아래에 g ++ 4.8.2를 사용하여 질문에 C에서 ++ 소스를 컴파일 된 32 비트 Cygwin에서.)
당신이 빈 파일을 생성 서브 프로세스에 문제가 있다면, Java에서 코드를 호출하는 또 다른 방법을 찾기보다는 * that * 문제에 대해 물어보십시오. 어쩌면 버그는 C++ 코드 (연결된 터미널없이 실행될 때)에있을 수 있습니다. –
@ Greg하지만 명령 행을 사용하여 작동합니다. – user2738698
예, 그렇습니다. 그러나 명령 행에서 작동하는 방식으로 프로그램을 잘못 작성하는 것은 가능하지만 다른 프로세스에서 호출 할 때는 프로그램을 작성할 수 없습니다. –