Неблокирующее / асинхронное fifo / именованный канал в оболочке / файловой системе? - PullRequest
10 голосов
/ 27 июня 2011

Есть ли способ создать неблокирующий / асинхронный именованный канал или что-то подобное в оболочке? Чтобы программы могли помещать строки в нее, эти строки оставались бы в оперативной памяти, и когда какая-то программа могла читать некоторые строки из канала, оставляя то, что не читала в fifo? Также очень вероятно, что программы могут одновременно писать и читать на этот fifo. Сначала я подумал, что, возможно, это можно сделать с помощью файлов, но после небольшого поиска в Интернете кажется, что ничего хорошего не может быть получено из-за того, что файл читается и записывается одновременно. Именованные каналы почти сработали бы, просто есть две проблемы: во-первых, они блокируют чтение / запись, если на другом конце никого нет, во-вторых, даже если я разрешаю запись в заблокированный канал и задаю два процесса для записи в канал, пока никто не читает, пытаясь написать по одной строке для каждого процесса, а затем попытаться head -n 1 <fifo>, я получаю только одну нужную строку, но оба процесса записи завершаются, а вторая строка теряется. Какие-либо предложения?

Редактировать: может быть, какая-нибудь промежуточная программа могла бы помочь с этим, действуя как посредник между писателями и читателями?

1 Ответ

5 голосов
/ 14 июля 2011

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

bzcat archive.bz2 | буфер -m 16000000 -b 100000 | processing_script | bzip2> archive_processed.bz2

http://linux.die.net/man/1/buffer

...