Содержание
- 3. При обмене данными между параллельными процессами различают два способа передачи данных: потоком; сообщением. Если данные передаются
- 4. С точки зрения направления передачи данных различают следующие виды связей: полудуплексная связь, т. е. данные по
- 5. Предполагая, что рассматриваются только полудуплексные связи, определим возможные топологии связей. Под топологией связи будем понимать конфигурацию
- 7. Передача сообщений Концептуально обмен сообщениями между процессами выполняется при помощи двух функций: send — послать сообщение;
- 8. Синхронный и асинхронный обмен данными При передаче данных различают синхронный и асинхронный обмен данными. Если поток-отправитель,
- 9. Буферизация Буфером называется вместимость связи между процессами, т. е. количество сообщений, которые могут одновременно пересылаться по
- 10. Работа с анонимными каналами в Windows Анонимным каналом называется объект ядра операционной системы, который обеспечивает передачу
- 11. Характеристики анонимных каналов, которые необходимо учитывать при их использовании для обмена данными между параллельными процессами: не
- 12. Анонимные каналы создаются процессом-сервером при помощи функции createPipe, которая имеет следующий прототип: BOOL CreatePipe( PHANDLE hReadHandle,
- 13. Для записи данных в анонимный канал используется функция WriteFile, которая имеет следующий прототип: BOOL WriteFile( HANDLE
- 14. Для чтения данных из анонимного канала используется функция ReadFile, которая имеет следующий прототип: BOOL ReadFile( HANDLE
- 15. BOOL DuplicateHandle( HANDLE hSourceProcessHandle, // дескриптор процесса - источника HANDLE hSourceHandle, // дубликат дескриптора HANDLE hTargetProcessHandle,
- 16. #include #include int main(int argc, char *argv[]) { HANDLE hWritePipe; // преобразуем символьное представление дескриптора в
- 17. { _cputs("Write to file failed.\n"); _cputs("Press any key to finish.\n"); _getch(); return GetLastError(); } _cprintf("The number
- 18. #include #include int main() { char lpszComLine[80]; // для командной строки STARTUPINFO si; PROCESS_INFORMATION pi; HANDLE
- 19. { _cputs("Create pipe failed.\n"); _cputs("Press any key to finish.\n"); _getch(); return GetLastError(); } // делаем наследуемый
- 20. { _cputs("Duplicate handle failed.\n"); _cputs("Press any key to finish.\n"); _getch(); return GetLastError(); } // закрываем ненужный
- 21. lpszComLine, // командная строка NULL, // атрибуты защиты процесса по умолчанию NULL, // атрибуты защиты первичного
- 22. return GetLastError(); } // закрываем дескрипторы нового процесса CloseHandle(pi.hProcess); CloseHandle(pi.hThread); // закрываем ненужный дескриптор канала CloseHandle(hInheritWritePipe);
- 23. { _cputs("Read from the pipe failed.\n"); _cputs("Press any key to finish.\n"); _getch(); return GetLastError(); } _cprintf("The
- 24. #include #include int main(int argc, char *argv[]) { HANDLE hWritePipe, hReadPipe; HANDLE hEnableRead; // для синхронизации
- 25. _cputs("Press any key to start communication.\n"); _getch(); // пишем в анонимный канал for (int i =
- 26. // ждем разрешения на чтение WaitForSingleObject(hEnableRead, INFINITE); // читаем ответ из анонимного канала for (int j
- 27. } _cprintf("The number %d is read from the pipe.\n", nData); } _cputs("The process finished reading from
- 28. #include #include int main() { char lpszComLine[80]; // для командной строки HANDLE hEnableRead; // для синхронизации
- 29. // создаем анонимный канал if(!CreatePipe( &hReadPipe, // дескриптор для чтения &hWritePipe, // дескриптор для записи &sa,
- 30. // запускаем новый консольный процесс if (!CreateProcess( NULL, // имя процесса lpszComLine, // командная строка NULL,
- 31. // закрываем дескрипторы нового процесса CloseHandle(pi.hProcess); CloseHandle(pi.hThread); // читаем из анонимного канала for (int i =
- 33. Скачать презентацию