2009-02-24 5 views
17

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

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

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

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

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

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

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

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

+0

Вам нужно открыть выходную трубу перед срабатыванием() на входной трубе? –

+0

@tinkertim - я предполагаю, что технически нет - я установил их обоих в функцию настройки, но я мог просто настроить выходной канал первым, а затем вызвать select, почему? – Zxaos

ответ

12

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

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

+1

Я дам этот снимок для читателя - но я не могу установить O_NONBLOCK на выходной канал ... – Zxaos

+1

В стандарте POSIX говорится (из select()): «Дескриптор считается считанным готовым для чтения при вызове к входной функции с очисткой O_NONBLOCK не будет блокироваться, будет ли функция успешно передавать данные ». (POSIX.1: 2008). –

+1

Открытие трубы O_RDWR приведет к тупиковой ситуации, когда программа считывает (или записывает) - если только на самом деле нет другого процесса с открытым трубой. –

 Смежные вопросы

  • Нет связанных вопросов^_^