У меня есть 2 приложения, один написан на C, а другой в JAVA. Позволяет называть эти приложения «C» и «JAVA».Проблемы с FIFO между процессом C и JAVA-приложением
- C Создает именованный канал через mkfifo (также пытались MKNOD - нет никакой разницы в результатах)
- C вилки выключения с дочерним процессом Вызова системы() вызовом пожарно-прикладной JAVA, проходящим ему, имя файла FIFO. IE: система ("имя-Java-приложение 'имя-Fifo-файл'")
- C родитель открывает FIFO для записи только
JAVA открывает FIFO для чтения.
- C отправляет сообщение «рукопожатия» в FIFO через write().
- JAVA получает «рукопожатие»
- C затем пытается отправить последующие сообщения в JAVA через FIFO.
Вот где это странно. Если C не закрывает (не удаляет) FIFO FD или если родительский процесс завершается, JAVA не будет читать из FIFO. Если C посылает «рукопожатие», то закрывается, все хорошо и, как ожидалось. Если C затем повторно открывает FIFO, отправляет «сообщение» JAVA, тогда C закрывается, JAVA будет его читать.
Из всех примеров FIFO между C и JAVA, которые я изучил, они включают только одну передачу данных. IE, открывать, писать/читать, закрывать, но не продолжать поток из источника в пункт назначения, как мне нужно.
Реализация «открытого, считывания/записи, закрытия» на каждом конце работает, но, безусловно, должен быть более эффективный или более эффективный метод, более соответствующий принципам труб. Если это так, я был бы очень признателен за любой вклад!
Невозможно помочь без кода, но непосредственное подозрение в том, что вы не очищаете свои записи. – chrylis
Почему 'system()', а не 'execve()'? – fge
Кроме того, вы делаете флеш() после того, как пишете в трубу? – fge