Когда вы открываете FIFO для записи, писатель блокируется до тех пор, пока не появится читатель.
Вы, вероятно, скучаете по читателю.
Вы не можете написать в канал, затем закрыть его, а затем заставить читателя прийти позже. Такая семантика хранения достигается за счет использования обычного файла.
Каналы — это механизм межпроцессного взаимодействия; канал, созданный открытием FIFO, аналогичен объекту, возвращаемому библиотечной функцией pipe
POSIX C, за исключением того, что pipe
возвращает объект, который уже подготовлен для ввода-вывода, поскольку имеется два дескриптора: противоположные концы открыты для противоположных направлений ввода /О. В то время как конечные точки FIFO открываются отдельно по одной за раз.
Объект FIFO в файловой системе — это всего лишь точка контакта, которая позволяет нескольким процессам подключаться к одному и тому же каналу.
Изначально объекта трубы не существует. Когда первый процесс выполняет open
для объекта FIFO в файловой системе, создается канал. Любые дополнительные запросы open
от того же или другого процесса присоединяются к тому же объекту канала, хранящемуся в ядре. Ввод-вывод не может иметь место, пока канал не будет открыт хотя бы один раз для чтения и хотя бы один раз для записи. Фактический ввод-вывод канала проходит через ядро; он не хранится в файловой системе. Когда все процессы закрывают канал, объект исчезает.
FIFO можно спроектировать таким образом, чтобы ввод-вывод мог начаться до того, как какой-либо процесс откроет объект для чтения. Другими словами, запрос на запись может быть разрешен, а затем заблокирован только тогда, когда канал заполнится. У этой конструкции были бы проблемы. Например, что делать, если запись маленькая, чтобы труба не заполнялась? Писатель запишет данные и продолжит их выполнение. Если он просто выйдет до того, как читатель прочитает данные, данные исчезнут навсегда! Поведение блокировки гарантирует, что читатель сможет перехватить данные; когда модуль записи разблокирован, он может быть уверен, что канал чтения открыт, и поэтому он может безопасно закрыть свой конец канала без потери данных. Дизайн, который не блокирует запись, даже если читатель недоступен, должен будет держать объект канала внутри ядра, даже если он не открыт ни одним процессом, чтобы писатель мог открыть канал, поместить в него данные, а затем уйти. и позже читатель может подобрать данные. В противном случае дизайн должен был бы предоставить писателю блокировку close
(аналогично SO_LINGER
-устроенному поведению на сокете), которая ожидает удаления ранее записанных данных.
person
Kaz
schedule
07.06.2014