У меня есть процесс, который в основном служит кешем и взаимодействует с другими процессами через именованные каналы. Периодически эти другие процессы могут отправлять сообщения в процесс кэширования. Теперь, в принципе, что будет работать для меня в процессе кэш-то вроде:Именованная труба: как заблокировать, пока закрытая сторона записи не откроется?
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
.
Зачем мне это нужно?
Процесс кэширования должен быть демоном, а другие процессы должны взаимодействовать с этим демоном всякий раз, когда пользователь вызывает соответствующие двоичные файлы.
Eh? Именованные трубы, открытые с обоих концов *, не являются * в EOF. –
Это так: процесс может открыть трубу, написать ей, закрыть ее и повторить этот цикл в любой момент времени. Это имеет смысл теперь с EOF? (Я не так хорошо знаком с этой областью) – ben
Ahh! Да, это немного лучше. Один из вариантов заключается в том, чтобы открыть RW - тогда это никогда не EOF, а другое - использовать API-интерфейс платформы, такой как inotify, чтобы получать уведомления, когда кто-то открывает трубку. –