2015-02-22 2 views
0

У меня есть 2 приложения, один написан на C, а другой в JAVA. Позволяет называть эти приложения «C» и «JAVA».Проблемы с FIFO между процессом C и JAVA-приложением

  1. C Создает именованный канал через mkfifo (также пытались MKNOD - нет никакой разницы в результатах)
  2. C вилки выключения с дочерним процессом Вызова системы() вызовом пожарно-прикладной JAVA, проходящим ему, имя файла FIFO. IE: система ("имя-Java-приложение 'имя-Fifo-файл'")
  3. C родитель открывает FIFO для записи только

JAVA открывает FIFO для чтения.

  1. C отправляет сообщение «рукопожатия» в FIFO через write().
  2. JAVA получает «рукопожатие»
  3. C затем пытается отправить последующие сообщения в JAVA через FIFO.

Вот где это странно. Если C не закрывает (не удаляет) FIFO FD или если родительский процесс завершается, JAVA не будет читать из FIFO. Если C посылает «рукопожатие», то закрывается, все хорошо и, как ожидалось. Если C затем повторно открывает FIFO, отправляет «сообщение» JAVA, тогда C закрывается, JAVA будет его читать.

Из всех примеров FIFO между C и JAVA, которые я изучил, они включают только одну передачу данных. IE, открывать, писать/читать, закрывать, но не продолжать поток из источника в пункт назначения, как мне нужно.

Реализация «открытого, считывания/записи, закрытия» на каждом конце работает, но, безусловно, должен быть более эффективный или более эффективный метод, более соответствующий принципам труб. Если это так, я был бы очень признателен за любой вклад!

+0

Невозможно помочь без кода, но непосредственное подозрение в том, что вы не очищаете свои записи. – chrylis

+0

Почему 'system()', а не 'execve()'? – fge

+0

Кроме того, вы делаете флеш() после того, как пишете в трубу? – fge

ответ

0

решаемые

Readline JAVA ожидает либо '\ г' или '\ п', чтобы завершить строку. Исходя из среды UNIX C (где ожидается «\ 0» в качестве «стандартного» терминатора) и, будучи довольно новым для JAVA, это был интересный урок для изучения!

Tnx chrylis и fge для вашего ввода!

+0

В C также строка заканчивается '\ n'. Как вы говорите, '\ 0' используется в C для завершения целой строки, но это разница. – glglgl