Программное обеспечение САПР. Операционные системы. Майстренко Н.В - 36 стр.

UptoLike

{
ErrorHandler(hwnd, "Ошибка открытия почтового ящика");
return FALSE;
}
// Запись сообщения в почтовый ящик
fResult = WriteFile(hFile,
lpszMessage,
(DWORD) lstrlen(lpszMessage) + 1, // включая признак конца строки
&cbWritten,
(LPOVERLAPPED) NULL);
if (!fResult)
{
ErrorHandler(hwnd, "Ошибка при записи сообщения");
return FALSE;
}
TextOut(hdc, 10, 10, "Сообщение отправлено успешно.", 21);
fResult = CloseHandle(hFile);
if (!fResult)
{
ErrorHandler(hwnd, "Ошибка при закрытии дескриптора");
return FALSE;
}
TextOut(hdc, 10, 30, "Дескриптор закрыт успешно.", 23);
return TRUE;
3. Чтение сообщений из почтового ящика. Создавший почтовый ящик процесс получает право считывания сообщений,
из него используя дескриптор mailslot’а в вызове функции ReadFile.
Почтовый ящик существует до тех пор, пока не вызвана функция CloseHandle на сервере или пока существует сам про-
цесс сервера. В обоих случаях все непрочитанные сообщения удаляются из почтового ящика, уничтожаются все клиентские
дескрипторы и mailslot удаляется из памяти.
Функция считывает параметры почтового ящика:
BOOL GetMailslotInfo(
HANDLE hMailslot, // Дескриптор почтового ящика.
LPDWORD lpMaxMessageSize, // Максимальный размер
// сообщения.
LPDWORD lpNextSize, // Размер следующего
// непрочитанного сообщения.
LPDWORD lpMessageCount, // Количество сообщений.
LPDWORD lpReadTimeout // Таймаут операции чтения.
);
Функция устанавливает таймаут операции чтения:
BOOL SetMailslotInfo(
HANDLE hMailslot, // Дескриптор почтового ящика.
DWORD lReadTimeout // Новый таймаут операции
// чтения.
);
Каналы (pipe)
Существует два способа организовать двунаправленное соединение с помощью каналов: безымянные и именованные
каналы.
1. Безымянные (или анонимные) каналы позволяют связанным процессам передавать информацию друг другу.
Обычно, безымянные каналы используются для перенаправления стандартного ввода/вывода дочернего процесса так, чтобы
он мог обмениваться данными с родительским процессом. Чтобы производить обмен данными в обоих направлениях, следу-
ет создать два безымянных канала. Родительский процесс записывает данные в первый канал, используя его дескриптор за-
писи, в то время как дочерний процесс считывает данные из канала, используя дескриптор чтения. Аналогично, дочерний
процесс записывает данные во второй канал и родительский процесс считывает из него данные. Безымянные каналы не мо-
гут быть использованы для передачи данных по сети и для обмена между несвязанными процессами!