У меня есть случай, когда у меня есть входящий поток сложных сообщений, которым требуется некоторая обработка, прежде чем они будут переданы в упрощенном формате фактическому обработчику.Контроль готовности файловых дескрипторов
Я хотел бы использовать дескриптор файла FIFO, с одним потоком, заполняющим его с одного конца, а другой - чтением другого. Теперь вид поведения, который я хотел бы иметь: поток чтения ждет с select()
, и я хотел бы гарантировать, что после пробуждения есть полный пакет, который можно прочитать с вызовом read()
, т.е. я хочу избежать для сборки пакетов из-за фрагментации из-за размеров буфера (пакеты гарантированно будут ниже предела прохождения буфера ядра к пользователю).
Я хочу знать, есть ли способ настроить FIFO таким образом, чтобы я мог вручную определить, когда дескриптор файла готов, то есть когда производитель успешно написал полный пакет, я хотел бы иметь способ подачи сигнала на конец считывания (через дескриптор файла), что чтение готово. Есть ли способ достичь этого через ioctl()
или есть какая-то абстракция, кроме FIFO, которая предлагает такое поведение (в мире Linux)? (Я знаю о pthread
и переменных условиях, но я хотел бы связь между производителем и потребителем должен быть ограничен общим файловым дескриптор.)