Итак, я пытаюсь прочитать вывод двоичного кода c из java-кода, и я не могу понять, заблокирован ли канал связи или не блокируется.Выполнено C двоичный код из java и чтение из выходного потока процесса
Установка такова:
класс Java (
A.java
) запускаетсяA.java работает кесарево двоичный (
B.o
) с помощьюRuntime.getRuntime().exec("B.o")
. На данный момент у меня есть объект Process (возвращенное Runtime.exec)A.java считывает из входного потока объекта с использованием процесса BufferedReader
A.java выводит данные, считанные из входного поток в файл (
output.txt
)
Бо двоичная просто печатает случайные строки с помощью вызова функции Printf.
Теперь, если я запустил вышеуказанную настройку, я получаю все данные, отправленные B.o
безупречно. Затем, чтобы проверить (блокирующая/неблокирующая вещь), я изменил A.java
на спящий режим в течение 5 миллисекунд после каждого чтения из входного потока объекта Process B.o
. Как выяснилось, теперь я не получал полных данных в A.java
, отправил B.o
. Это указывает на то, что используемый канал связи не блокирует (согласно моему слабому пониманию).
Тогда, чтобы убедиться, я начал изучать исходный код java, чтобы узнать, прав ли я. И я нашел следующее до сих пор:
Каждый звонок до Runtime.getRuntime().exec(...)
заканчивается в forkAndExec()
методом в ProcessImpl_md.c
. В ProcessImpl_md.c выполняется команда, создается процесс, и PIPES настраиваются для связи (используя вызов функции pipe в c). Я не могу найти нигде в исходном коде, где PIPES устанавливаются в неблокирующий режим (как указано моим кодом). Я предполагаю, что PIPES блокируют по умолчанию.
Я знаю, что это очень плохой способ проверить, что я хочу проверить. Я нахожусь вне моей глубины здесь, и я думаю, что это бесполезно.
Может кто-нибудь мне точку в правильном направлении или сказать мне:
ли ТРУБЫ процесса, созданного с помощью Java Runtime API блокирующие или без блокировки?
Когда я делаю
A.java
сон после чтения из входного потока, почему все данные не получены? (Предположение того, что PIPE блокирует)Любой не-программным способом (т.е. я не должен изменить исходный код Java и т.д.!), Чтобы выяснить, если ТРУБ процесса блокируют или не блокировать?
спасибо.
EDIT: (добавлен код)
После не фактической (или даже компилируемый код), но это показывает, что я пытаюсь сделать.
Источник "B.o":
#include <stdio.h>
void main(int argc, char*argv[]){
int a = 0;
for(; a<9000000; a++){
printf("%s", argv[1]);
}
}
Источник "A.java":
<java imports>
public class A{
public static void main(String[] args) throws Exception{
Process p = Runtime.getRuntime().exec("./B.o");
BufferedReader br = new
BufferedReader(new InputStreamReader(p.getInputStream()));
int a = 0;
while(br.readLine() != null){
a++;
Thread.sleep(5);//data missed if this line not commented out
}
br.close();
System.out.println(a);
}
}
ПРОВЕРЬТЕ МОЙ ОТВЕТ. БЕСПЛАТНЫЙ ВОПРОС МЕНЯ.
Я бы не использовал расширение * .o для исполняемых файлов (ваш 'B.o'). Это расширение обычно используется для объектных файлов. –
Сон не должен изменять вход, который вы получаете из InputStream, завернутого в BufferedReader. «Неблокирующее» чтение не означает, что вы пропускаете ввод, чтобы перейти к более поздней записи в трубе. Тем не менее, неясно, почему вы наблюдаете пропущенные данные. Не могли бы вы разместить соответствующий код? –
Действительно "случайные" линии? Вы никогда не узнаете, пропадут ли некоторые из них. – laune