Подтвердить что ты не робот

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

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

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

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

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

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

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

Любые предложения?

(выполняется в Linux-системе)

4b9b3361

Ответ 1

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

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