Неблокирующий/асинхронный fifo/named pipe в оболочке/файловой системе?

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

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

Ответ 1

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

bzcat archive.bz2 | buffer -m 16000000 -b 100000 | processing_script | bzip2 > archive_processed.bz2

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