Операционные системы. Учебное пособие. Марапулец Ю.В. - 180 стр.

UptoLike

Составители: 

Параметр fdwAccess определяет, с какой целью (для чтения или для записи) будет
использоваться канал. Если канал был создан с флагом PIPE_ACCESS_OUTBOUND,
при вызове функции CreateFile() должно быть задано значение GENERIC_READ. Для
работы с входным каналом клиент должен иметь привилегии класса GENERIC_WRITE,
для работы с двухсторонним каналом - привилегии класса GENERIC_READ |
GENERIC_WRITE.
Параметр fdwShareMode(), как правило, имеет значение 0, предотвращая таким об-
разом совместное использование канала другими процессами. Однако иногда клиент
при необходимости продублировать дескриптор канала для другого клиента вынужден
применять режим совместного использования. В этом случае оба клиента будут иметь
дескрипторы одного и того же экземпляра того же самого канала, и необходимо принять
меры для синхронизации операций записи и чтения.
Атрибуты безопасности, хранящиеся в параметре lpsa, вам уже знакомы. Флаг
fdwCreate должен иметь значение OPEN_EXISTING, поскольку функция CreateFile() не
создает новый канал, а просто; открывает уже существующий. Остальные флаги позво-
ляют функции CreateFile() создавать новые файловые объекты, однако если параметр
lpszName соответствует объекту-каналу, использование этих флагов приведет к ошибке.
Последние два параметра функции CreateFile() обычно управляют атрибутами
файла, например атрибутом скрытости, архивности или доступа только для чтения, од-
нако функция CreateFile() использует эти атрибуты только при создании новых файлов.
При открытии существующего файла (флаг OPEN_EXISTING) объект сохраняет свои
атрибуты. Но есть два исключения из этого правила. При открытии существующего
именованного канала срабатывают два флага параметра fdwAttrsAndFlags:
FILE_FLAG_WRITE_THROUGH и FILE_FLAG_OVERLAPPED. Клиент может устано-
вить флаги, которые отличаются от флагов, установленных сервером, разрешая или за-
прещая буферизацию в сети и асинхронный ввод/вывод в соответствии со своими по-
требностями.
На двух концах одного и того же канала могут быть установлены разные режимы
чтения или записи, однако при открытии дескриптора для клиента функция CreateFile()
всегда копирует исходные атрибуты. В то же время каждый процесс может изменить
свой дескриптор канала с помощью функции SetNamedPipeHandleState().
BOOL SetNamedPipeHandleState(
HANDLE hNamedPipe, // дескриптор именованного канала
LPDWORD lpdwModes, // флаги режима чтения и ожидания
LPDWORD lpdwMaxCollect, // размер передающего буфера
LPDWORD lpdwCollectDataTimeout ); // максимальное время, оставшееся
// до начала передачи
Параметр hNamedPipe представляет собой дескриптор, возвращаемый функцией
CreateNamedPipe() или CreateFile().
Параметр lpdwModes, подобно параметру fdwPipeMode функции
CreateNamedPipe(), содержит комбинацию флагов, которые позволяют одновременно
задать несколько атрибутов. Параметр lpdwModes определяет, какой режим, байтовый
или режим сообщений, будет использоваться при операциях чтения и будут ли блокиро-
ваться некоторые команды в ожидании доступа к каналу. Режим чтения задается флагом
PIPE_READMODE_BYTE или PIPE_READMODE_MESSAGE. (Если задать режим со-
общений для канала, который был создан с флагом PIPE_READMODE_BYTE, функция
возвратит код ошибки.) Режим чтения может использоваться в сочетании с флагом
PIPE_WAIT или PIPE_NOWAIT.
182
     Параметр fdwAccess определяет, с какой целью (для чтения или для записи) будет
использоваться канал. Если канал был создан с флагом PIPE_ACCESS_OUTBOUND,
при вызове функции CreateFile() должно быть задано значение GENERIC_READ. Для
работы с входным каналом клиент должен иметь привилегии класса GENERIC_WRITE,
для работы с двухсторонним каналом - привилегии класса GENERIC_READ |
GENERIC_WRITE.
     Параметр fdwShareMode(), как правило, имеет значение 0, предотвращая таким об-
разом совместное использование канала другими процессами. Однако иногда клиент
при необходимости продублировать дескриптор канала для другого клиента вынужден
применять режим совместного использования. В этом случае оба клиента будут иметь
дескрипторы одного и того же экземпляра того же самого канала, и необходимо принять
меры для синхронизации операций записи и чтения.
     Атрибуты безопасности, хранящиеся в параметре lpsa, вам уже знакомы. Флаг
fdwCreate должен иметь значение OPEN_EXISTING, поскольку функция CreateFile() не
создает новый канал, а просто; открывает уже существующий. Остальные флаги позво-
ляют функции CreateFile() создавать новые файловые объекты, однако если параметр
lpszName соответствует объекту-каналу, использование этих флагов приведет к ошибке.
     Последние два параметра функции CreateFile() обычно управляют атрибутами
файла, например атрибутом скрытости, архивности или доступа только для чтения, од-
нако функция CreateFile() использует эти атрибуты только при создании новых файлов.
При открытии существующего файла (флаг OPEN_EXISTING) объект сохраняет свои
атрибуты. Но есть два исключения из этого правила. При открытии существующего
именованного канала срабатывают два флага параметра fdwAttrsAndFlags:
FILE_FLAG_WRITE_THROUGH и FILE_FLAG_OVERLAPPED. Клиент может устано-
вить флаги, которые отличаются от флагов, установленных сервером, разрешая или за-
прещая буферизацию в сети и асинхронный ввод/вывод в соответствии со своими по-
требностями.
     На двух концах одного и того же канала могут быть установлены разные режимы
чтения или записи, однако при открытии дескриптора для клиента функция CreateFile()
всегда копирует исходные атрибуты. В то же время каждый процесс может изменить
свой дескриптор канала с помощью функции SetNamedPipeHandleState().

BOOL SetNamedPipeHandleState(
     HANDLE hNamedPipe,          // дескриптор именованного канала
     LPDWORD lpdwModes,          // флаги режима чтения и ожидания
     LPDWORD lpdwMaxCollect,     // размер передающего буфера
     LPDWORD lpdwCollectDataTimeout ); // максимальное время, оставшееся
                                 // до начала передачи

     Параметр hNamedPipe представляет собой дескриптор, возвращаемый функцией
CreateNamedPipe() или CreateFile().
     Параметр      lpdwModes,       подобно параметру     fdwPipeMode     функции
CreateNamedPipe(), содержит комбинацию флагов, которые позволяют одновременно
задать несколько атрибутов. Параметр lpdwModes определяет, какой режим, байтовый
или режим сообщений, будет использоваться при операциях чтения и будут ли блокиро-
ваться некоторые команды в ожидании доступа к каналу. Режим чтения задается флагом
PIPE_READMODE_BYTE или PIPE_READMODE_MESSAGE. (Если задать режим со-
общений для канала, который был создан с флагом PIPE_READMODE_BYTE, функция
возвратит код ошибки.) Режим чтения может использоваться в сочетании с флагом
PIPE_WAIT или PIPE_NOWAIT.



                                       182