328
С точки зрения реализации канал представляет собой классический
вариант задачи "производитель–потребитель": один процесс пишет в канал
данные, другой – читает их из канала. Если при попытке записи данных в
канал обнаруживается, что канал полон, пишущий процесс блокируется до
освобождения места в канале, если при попытке чтения данных
обнаруживается, что канал пуст, читающий процесс блокируется до
появления в канале данных. Внутренним механизмом ОС,
обеспечивающим синхронизацию в таких ситуациях, является, конечно же,
семафор.
Именованные каналы представляют собой удобное средство
клиент/серверных коммуникаций. Именованные каналы в некоторых ОС
(например, OS/2) существенно отличаются от неименованных.
Именованные каналы ориентированы в этих системах прежде всего на
взаимодействие процессов в сетевой среде (или, точнее, для них
прозрачно, находятся ли оба процесса на одном компьютере или в разных
узлах сети). Такой канал двунаправленный, то есть к нему возможны
обращения и для чтения, и для записи. Данные в канале могут
передаваться как потоком байт, так и сообщениями. В последнем случае
каждое сообщение снабжается заголовком, в котором указывается его
длина. К одному концу канала постоянно подключен процесс, его
создавший, – владелец или сервер, к другому концу могут подключаться
различные процессы-клиенты, таким образом, обмен данными по
именованному каналу между процессами, ни один из которых не является
владельцем канала, невозможен. При создании канала (системный вызов
createNamedPipe) указывается максимально возможное число
клиентов, которые могут быть одновременно подключены к каналу (это
число, впрочем, может и не ограничиваться). Когда владелец создает
канал, последний находится в так называемом отключенном состоянии.
Системным вызовом connectNamedPipe владелец переводит канал в