2014-08-27 3 views
2

У меня есть процесс, который в основном служит кешем и взаимодействует с другими процессами через именованные каналы. Периодически эти другие процессы могут отправлять сообщения в процесс кэширования. Теперь, в принципе, что будет работать для меня в процессе кэш-то вроде:Именованная труба: как заблокировать, пока закрытая сторона записи не откроется?

while(true) { 
    int read_status = read(fifo_fd, buffer, BUFFER_SIZE); 
    if (read_status > 0) { 
     //at least a byte was read -> do something with the message 
    } 
} 

Но это, очевидно, сосет с точки зрения производительности, так как read() немедленно вернуться на EOF в результате напряженного цикла ожидания, как только там нет ничего читать в трубе. (EDIT) Я получаю EOF поскольку процесс записи может выполнять следующий цикл несколько раз: open()write()close()

Я хотел бы иметь весь цикл, чтобы блокировать, если нет символов, кроме EOF в трубе , Я также исследовал на select() и poll(), которые оба также не блокируют для EOF.


Зачем мне это нужно?

Процесс кэширования должен быть демоном, а другие процессы должны взаимодействовать с этим демоном всякий раз, когда пользователь вызывает соответствующие двоичные файлы.

+1

Eh? Именованные трубы, открытые с обоих концов *, не являются * в EOF. –

+0

Это так: процесс может открыть трубу, написать ей, закрыть ее и повторить этот цикл в любой момент времени. Это имеет смысл теперь с EOF? (Я не так хорошо знаком с этой областью) – ben

+1

Ahh! Да, это немного лучше. Один из вариантов заключается в том, чтобы открыть RW - тогда это никогда не EOF, а другое - использовать API-интерфейс платформы, такой как inotify, чтобы получать уведомления, когда кто-то открывает трубку. –

ответ

3

Откройте свою трубу для чтения/записи, а не для чтения. Это предотвратит EOF, когда внешний писатель закроет его.

В качестве альтернативы, при получении EOF закройте трубу и откройте ее.

+0

Мне просто интересно: предположим, что я выбираю второе решение - нет ли тогда небольшого временного интервала между close() и open(), в течение которого входящие сообщения будут отброшены? – ben

+0

Не между 'close()' и 'open()' no, так как все новые авторы будут блокировать. –

+0

Хорошо. Большое вам спасибо - я кое-что узнал в этом вопросе-нитке! – ben