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

UptoLike

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

В качестве аргументов этой функции необходимо передать дескриптор файла, ука-
затель на структуру OVERLAPPED, использованную при обращении к функции вво-
да/вывода, указатель на переменную, в которую будет занесено количество переданных
байт, и флаг, определяющий, должен ли вызов ждать завершения процедуры вво-
да/вывода или ему следует немедленно вернуть управление вызывающей программе,
чтобы сообщить ей о текущем состоянии запроса на ввод/вывод. Если этот флаг имеет
значение TRUE и операция ввода/вывода все еще не завершена, вызов будет ожидать до
тех пор, пока операция ввода/вывода завершится или произойдет ошибка. Если флаг
ожидания имеет значение FALSE, вызов возвращает ошибку (нулевое значение).
Если вызов вернул нулевое значение, а флаг ожидания равен FALSE, необходимо
обратиться к GetLastError(). Если этот вызов вернул значение ER-
ROR_IO_INCOMPLETE, значит, процедура ввода/вывода все еще не завершена. Любое
другое значение свидетельствует о том, что в ходе выполнения ввода/вывода произошла
ошибка.
Чтобы прервать выполнение операции ввода/вывода, следует использовать функ-
цию CanselIo.
BOOL CancelIo( HANDLE hFile); // дескриптор файла
Эта функция отменяет выполнение любых запросов на ввод/вывод, инициирован-
ных для некоторого дескриптора файла текущим потоком. Вызов CanselIo() работает
только в отношении процедур перекрывающегося ввода/вывода. Очевидно, что если по-
ток инициировал традиционную процедуру ввода/вывода, он не сможет обратиться к ка-
ким-либо другим вызовам до тех пор, пока процедура ввода/вывода не будет завершена.
Если вы прервали выполнение запроса на ввод/вывод при помощи вызова CanselIo(), со-
ответствующая операция ввода/вывода завершается с сообщением об ошибке ER-
ROR_OPERATION_ABORTED (это значение можно получить при помощи вызова Get-
LastError()).
В случае если было инициировано слишком большое количество запросов на асин-
хронный ввод/вывод, функция ReadFile() может завершиться возвратом значения ER-
ROR_INVALID_USER_BUFFER или ERROR_NOTENOUGH_MEMORY.
В некоторых ситуациях для осуществления операций перекрывающегося вво-
да/вывода удобнее использовать специально предназначенные для этого функции Read-
FileEx() и WriteFileEx(). Эти функции не могут использоваться для обычного вво-
да/вывода. В качестве дополнительного аргумента каждый из этих вызовов принимает
указатель на функцию, которая будет вызвана в момент завершения операции вво-
да/вывода.
BOOL ReadFileEx( HANDLE hFile,
LPVOID lpBuffer,
DWORD nNumberOfBytesToRead,
LPOVERLAPPED lpOverlapped,
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine );
BOOL WriteFileEx( HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPOVERLAPPED lpOverlapped,
LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine );
139
     В качестве аргументов этой функции необходимо передать дескриптор файла, ука-
затель на структуру OVERLAPPED, использованную при обращении к функции вво-
да/вывода, указатель на переменную, в которую будет занесено количество переданных
байт, и флаг, определяющий, должен ли вызов ждать завершения процедуры вво-
да/вывода или ему следует немедленно вернуть управление вызывающей программе,
чтобы сообщить ей о текущем состоянии запроса на ввод/вывод. Если этот флаг имеет
значение TRUE и операция ввода/вывода все еще не завершена, вызов будет ожидать до
тех пор, пока операция ввода/вывода завершится или произойдет ошибка. Если флаг
ожидания имеет значение FALSE, вызов возвращает ошибку (нулевое значение).
     Если вызов вернул нулевое значение, а флаг ожидания равен FALSE, необходимо
обратиться    к   GetLastError().  Если     этот   вызов   вернул    значение   ER-
ROR_IO_INCOMPLETE, значит, процедура ввода/вывода все еще не завершена. Любое
другое значение свидетельствует о том, что в ходе выполнения ввода/вывода произошла
ошибка.
     Чтобы прервать выполнение операции ввода/вывода, следует использовать функ-
цию CanselIo.

BOOL CancelIo( HANDLE hFile); // дескриптор файла

     Эта функция отменяет выполнение любых запросов на ввод/вывод, инициирован-
ных для некоторого дескриптора файла текущим потоком. Вызов CanselIo() работает
только в отношении процедур перекрывающегося ввода/вывода. Очевидно, что если по-
ток инициировал традиционную процедуру ввода/вывода, он не сможет обратиться к ка-
ким-либо другим вызовам до тех пор, пока процедура ввода/вывода не будет завершена.
Если вы прервали выполнение запроса на ввод/вывод при помощи вызова CanselIo(), со-
ответствующая операция ввода/вывода завершается с сообщением об ошибке ER-
ROR_OPERATION_ABORTED (это значение можно получить при помощи вызова Get-
LastError()).
     В случае если было инициировано слишком большое количество запросов на асин-
хронный ввод/вывод, функция ReadFile() может завершиться возвратом значения ER-
ROR_INVALID_USER_BUFFER или ERROR_NOTENOUGH_MEMORY.
     В некоторых ситуациях для осуществления операций перекрывающегося вво-
да/вывода удобнее использовать специально предназначенные для этого функции Read-
FileEx() и WriteFileEx(). Эти функции не могут использоваться для обычного вво-
да/вывода. В качестве дополнительного аргумента каждый из этих вызовов принимает
указатель на функцию, которая будет вызвана в момент завершения операции вво-
да/вывода.

BOOL ReadFileEx( HANDLE hFile,
           LPVOID lpBuffer,
           DWORD nNumberOfBytesToRead,
           LPOVERLAPPED lpOverlapped,
           LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine );

BOOL WriteFileEx( HANDLE hFile,
           LPCVOID lpBuffer,
           DWORD nNumberOfBytesToWrite,
           LPOVERLAPPED lpOverlapped,
           LPOVERLAPPED_COMPLETION_ROUTINE lpCompletionRoutine );




                                       139