Поделиться через


Режимы "Тип именованного канала", "Чтение" и "Ожидание"

Сервер конвейера задает режим типа канала, режим чтения и режим ожидания в параметре dwPipeMode функции CreateNamedPipe . Клиенты канала могут указывать эти режимы канала для своих дескрипторов каналов с помощью функции CreateFile .

Режим типа

Режим типа канала определяет, как данные записываются в именованный канал. Данные могут передаваться через именованный канал в виде потока байтов или в виде потока сообщений. Сервер конвейера указывает тип канала при вызове Метода CreateNamedPipe для создания экземпляра именованного канала. Режимы типов должны быть одинаковыми для всех экземпляров канала.

Чтобы создать канал типа байтов, укажите PIPE_TYPE_BYTE или используйте значение по умолчанию. Данные записываются в канал в виде потока байтов, и система не различает байты, записанные в различных операциях записи.

Чтобы создать канал типа сообщения, укажите PIPE_TYPE_MESSAGE. Система обрабатывает байты, записанные в каждой операции записи в канал, как единицу сообщения. Система всегда выполняет операции записи в конвейерах типов сообщений, как если бы был включен режим записи.

Режим чтения

Режим чтения канала определяет, как данные считываются из именованного канала. Сервер конвейера задает начальный режим чтения для дескриптора канала при вызове CreateNamedPipe. Данные можно считывать в режиме байтового чтения или в режиме чтения сообщений. Дескриптор канала байтового типа может находиться только в режиме байтового чтения. Дескриптор для канала типа сообщения может находиться в режиме байтового чтения или чтения сообщений. Для канала типа сообщения режим чтения может отличаться для дескрипторов сервера и клиента для одного экземпляра канала.

Чтобы создать дескриптор канала в режиме байтового чтения, укажите PIPE_READMODE_BYTE или используйте значение по умолчанию. Данные считываются из канала в виде потока байтов. Операция чтения завершается успешно, когда считываются все доступные байты в канале или при считывается указанное количество байтов.

Чтобы создать дескриптор канала в режиме чтения сообщений, укажите PIPE_READMODE_MESSAGE. Данные считываются из канала в виде потока сообщений. Операция чтения завершается успешно, только если прочитано все сообщение. Если указанное число считываемых байтов меньше размера следующего сообщения, функция считывает как можно больше сообщения перед возвратом нуля (функция GetLastError возвращает ERROR_MORE_DATA). Оставшуюся часть сообщения можно прочитать с помощью другой операции чтения.

Для клиента канала дескриптор канала, возвращаемый CreateFile , изначально всегда находится в режиме байтового чтения. Клиенты канала и серверы каналов могут использовать функцию SetNamedPipeHandleState для изменения режима чтения дескриптора канала. Дескриптор канала должен иметь право доступа к FILE_WRITE_ATTRIBUTES.

Режим ожидания

Режим ожидания дескриптора канала определяет, как функции ReadFile, WriteFile и ConnectNamedPipe обрабатывают длительные операции. В режиме блокировки и ожидания функции бесконечно ожидают завершения операции процесса на другом конце канала. В режиме неблокировки и ожидания функции немедленно возвращаются в ситуациях, которые в противном случае требовали бы неопределенного ожидания.

На операцию ReadFile влияет режим ожидания дескриптора канала, когда канал пуст. При использовании дескриптора блокировки и ожидания операция не завершается успешно, пока не будут доступны данные из потока, записываемого на другой конец канала. Используя дескриптор ожидания без блокировки, функция возвращает ноль немедленно, а функция GetLastError возвращает ERROR_NO_DATA.

На операцию WriteFile влияет режим ожидания дескриптора канала, если в буфере канала недостаточно места. При использовании дескриптора блокировки и ожидания операция записи не может быть успешной, пока потоком, считываемым с другого конца канала, не будет создано достаточно места в буфере. При неблокировочной дескрипторе ожидания операция записи возвращает ненулевое значение немедленно, без записи байтов (для канала типа сообщения) или после записи столько байтов, сколько буфер содержит (для канала байтового типа).

На операцию ConnectNamedPipe влияет режим ожидания дескриптора канала, когда нет клиента, подключенного или ожидающего подключения к экземпляру канала. При использовании дескриптора блокировки и ожидания операция подключения не выполняется до тех пор, пока клиент канала не подключится к экземпляру канала путем вызова функции CreateFile или CallNamedPipe . При использовании дескриптора ожидания без блокировки операция подключения возвращает ноль немедленно, а функция GetLastError возвращает ERROR_PIPE_LISTENING.

По умолчанию все дескриптора именованных каналов, возвращаемые функцией CreateNamedPipe или CreateFile , создаются с включенным режимом блокировки и ожидания. Чтобы создать канал в режиме ожидания без блокировки, сервер канала указывает PIPE_NOWAIT при вызове CreateNamedPipe.

Клиенты канала и серверы каналов могут изменить режим ожидания дескриптора канала, указав PIPE_WAIT или PIPE_NOWAIT в вызове функции SetNamedPipeHandleState .

Примечание

Режим неблокировки и ожидания поддерживается для совместимости с Microsoft LAN Manager версии 2.0. Этот режим не следует использовать для достижения перекрывающихся входных и выходных данных (I/O) с именованными каналами. Вместо этого следует использовать перекрывающиеся операции ввода-вывода, так как это позволяет выполнять длительные операции в фоновом режиме после возврата функции. Дополнительные сведения о перекрывающихся ввода-выводах см. в разделе Синхронные и перекрывающиеся входные и выходные данные.