2015-04-13 2 views
1

Я пытаюсь вызвать программу C через Java с помощью построителя процессов. Через Java я собираюсь скомпилировать программу C (что она делает), а затем запускает ее, а это не так.java process builder c c не отображает результаты?

Я ожидаю, что терминал, чтобы показать результат: 6, но бездельники показывая

программа Java (main.java)

import javax.swing.*; 
import java.awt.*; 
import java.awt.event.*; 
import java.io.*; 

public class main 
{ 
    public static void main(String[] args) throws InterruptedException, IOException 
    { 
    //compile + run 
    Process compile = new ProcessBuilder("gcc", "calculator.c").start(); 
    //delay program to allow ./a.out to create 
    try 
     { 
     Thread.sleep(1000);     //1000 milliseconds is one second. 
     } 
    catch(InterruptedException ex) 
     { 
     Thread.currentThread().interrupt(); 
     } 

    Process execute = new ProcessBuilder("./a.out").start(); 
    } 
} 

C Программа: (calculator.c)

#include <stdio.h> 

int main() 
{ 
    int a = 4; 
    int b = 2; 
    int c = a + b; 
    printf("Result: %d \n", c); 
} 
+3

You нужно прочитать «Input/ErrorStream» процесса, чтобы увидеть, что он выводил, например [this] (http://stackoverflow.com/questions/25377355/processbuilder-cannot-run-bat-file-with-spaces- in-path/25377564 # 25377564) например – MadProgrammer

+0

Спасибо за ответ, пробовал смотреть на него, и это кажется озадачивающим! Нужно ли добавлять новый метод? – lecardo

+0

Вам просто нужно использовать 'Input/ErrorStream', я обычно использую' Thread' для этого, так как мне нравится называть 'Process # waitFor', поэтому я могу получить код выхода для' Process', но так как это блокирующий вызов, я использую 'Thread', чтобы потреблять поток, но это только я – MadProgrammer

ответ

1

Вам необходимо ...

  1. Прочитать Input/ErrorStream процесса, таким образом, вы знаете, что они выдали.
  2. Используйте Process#waitFor чтобы определить, был ли у Process, использование предметов вроде Thread.sleep вызывает ошибки.

Потому что вам нужно потреблять Input/ErrorStream двух процессов, односвязной, что нужно сделать, это написать метод, который может сделать это для вас, так что вам не нужно дублировать код

public static void main(String[] args) { 
    try { 
     ProcessBuilder pb = new ProcessBuilder("gcc", "calculator.c"); 
     pb.redirectErrorStream(true); 

     Process compile = pb.start(); 
     consume(compile.getInputStream()); 

     int result = compile.waitFor(); 
     if (result == 0) { 

      pb = new ProcessBuilder("./a.out"); 
      pb.redirectErrorStream(true); 
      Process execte = pb.start(); 
      consume(execte.getInputStream()); 

      System.out.println("Program exited with " + execte.waitFor()); 

     } else { 

      System.err.println("Compiler exited with " + result); 

     } 
    } catch (IOException | InterruptedException exp) { 
     exp.printStackTrace(); 
    } 
} 

public static String consume(InputStream is) throws IOException { 
    StringBuilder result = new StringBuilder(64); 
    int in = -1; 
    while ((in = is.read()) != -1) { 
     result.append(result); 
     // Technquially, you don't need this, but I like to have it as a check 
     System.out.print((char) in); 
    } 
    return result.toString(); 
} 
Смежные вопросы