Как мне выполнить неблокирующую команду fopen на именованном канале (mkfifo)?

Если у меня есть программа, которая создает и пытается открыть именованный канал с помощью mkfifo, как я могу открыть канал для чтения или записи без блокировки?

В частности, я пишу программу на C, которую можно запускать с графическим интерфейсом или без него (написано на Java).

В программе C я успешно создаю именованные каналы с помощью mkfifo, однако когда я это делаю

FILE* in = fopen(PIPE_IN, "r"); /* Where PIPE_IN is the filename*/

fopen не возвращается, пока графический интерфейс не откроет этот канал для записи. Я хочу, чтобы этот канал был готов к чтению один раз (если) графический интерфейс решит записать в него - я помещу дескриптор файла в вызов select (). Разумно ожидать, что графический интерфейс Java может никогда не запуститься, поэтому я не могу полагаться на него, чтобы открыть другой конец канала в какой-либо конкретной точке или даже вообще.

У меня также будет открыта вторая труба для записи, и я предполагаю, что у меня будет такая же проблема. Кроме того, я не могу установить O_NONBLOCK для выходного канала, у которого нет считывателя.

Какие-либо предложения?

(Это работает в системе Linux)

Ответов (1)

Решение

Вы можете использовать open() свой канал O_RDONLY | O_NONBLOCK, и если вам нужен поток C, вы можете получить его с помощью fdopen() . Однако может быть проблема с select() - AFAIK, канал fd, открытый для чтения, который не имеет записи, всегда готов к чтению и read() возвращает 0, поэтому он select() будет срабатывать бесконечно.

Неуклюжий способ преодолеть это - открыть трубу O_RDWR ; то есть иметь хотя бы одного писателя (вашу программу на C++). Что в любом случае решило бы вашу проблему.