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