Книга: Linux программирование в примерах
9.3.1.2. Буферирование каналов
9.3.1.2. Буферирование каналов
Каналы буферируют свои данные, что означает, что записанные в канал данные хранятся ядром до тех пор, пока не будут прочитаны. Однако, канал может содержать лишь такое-то количество записанных, но еще не прочитанных данных. Мы можем называть записывающий процесс производителем, а читающий процесс потребителем. Как система управляет полными и пустыми каналами?
Когда канал полон, система автоматически блокирует производителя в следующий раз, когда он пытается осуществить запись данных в канал с помощью write()
. Когда канал освобождается, система копирует данные в канал, а затем позволяет системному вызову write()
вернуться к производителю.
Подобным же образом, если канал пустой, потребитель блокируется в read()
до тех пор, пока в канале не появятся данные для чтения. (Блокирующее поведение можно отключить; это обсуждается в разделе 9.4.3.4 «Неблокирующий ввод/вывод для каналов и очередей FIFO».)
Когда производитель вызывает на записывающем конце канала close()
, потребитель может успешно прочесть любые данные, все еще находящиеся в канале. После этого дальнейшие вызовы read()
возвращают 0, указывая на конец файла.
Напротив, если потребитель закрывает читаемый конец, write()
на записываемом конце завершается неудачей. В частности, ядро посылает производителю сигнал «нарушенный канал», действием по умолчанию для которого является завершение процесса.
Нашей любимой аналогией для каналов является то, как муж и жена вместе моют и сушат тарелки. Один супруг моет тарелки, помещая чистые, но влажные тарелки в сушилку на раковине. Другой супруг вынимает тарелки из сушилки и вытирает их. Моющий тарелки является производителем, сушилка является каналом, а вытирающий является потребителем.[96]
Если вытирающий супруг оказывается быстрее моющего, сушилка становится пустой, и вытирающему приходится ждать, пока не будут готовы новые тарелки. Напротив, если быстрее вытирающий супруг, сушилка наполняется, и моющему приходится ждать, пока она не опустеет, прежде чем помещать в нее тарелки. Это изображено на рис. 9.3.
Рис. 9.3. Синхронизация процессов канала
- 5.4.1. Создание каналов
- 3. Подключение каналов
- Использование каналов RSS
- Ключевые факторы успешного отбора каналов коммуникаций
- Просмотр веб-каналов
- Интегрирование каналов рекламы
- Функции транзакций именованных каналов
- 11.4.1. Создание входных точек устройств и именованных каналов
- 9.3.1.1. Создание каналов
- Чтение закрытых каналов
- Использование именованных каналов
- Создание именованных каналов