- •СПбГУТ им. проф. Бонч- Бруевича )))
- •План
- •Используемый софт
- •Таймер ожидания (Waitable Timer)
- •Таймер ожидания
- •Создание абсолютного таймера
- •Создание абсолютного таймера ожидания
- •Создание абсолютного таймера
- •Отображение информации в Process Explorer
- •Создание относительного таймера
- •Создание относительного таймера ожидания
- •Канал (Pipe)
- •Канал
- •Функциональность двух типов каналов
- •Создание анонимного канала
- •Создание анонимного канала
- •Создание анонимного канала
- •Создание анонимного канала
- •Создание анонимного канала
- •Отображение информации в Process Explorer
- •Создание именованного канала
- •Создание именованного канала
- •Создание именованного канала
- •Отображение информации в Process Explorer
- •Литература
- •Используемая литература
- •FINAL
Создание относительного таймера ожидания

if (hColTimer != NULL) { /* Если успешно */ /* Активируем таймер */
bSuccess = SetWaitableTimer(hColTimer, &liUTC_ColTime, 1000, &SpecFunc, NULL,
FALSE);
}
Канал (Pipe)
Канал
Канал — это секция общей памяти, которую процессы используют для связи.
Процесс, который создает канал, называется сервером канала.
Процесс, который подключается к каналу, называетсяАнонимныйклиентомканалканала. Именованный канал
Обычно |
передает |
данные |
Именованные |
каналы |
могут |
между |
родительским |
использоваться |
связи |
для |
|
процессом |
и |
дочерним |
обеспечения |
между |
|
процессом. Анонимные каналы |
процессами |
на |
одном |
||
всегда локальны; их нельзя |
компьютере |
или |
между |
||
использовать для |
связи по |
процессами |
на |
разных |
|
Функциональность двух типов каналов
Анонимный канал Именованный канал
CreatePipe |
— создание CreateNamedPipe |
— |
создание |
канала. |
канала. |
|
|
ReadFile — чтение данных ConnectNamedPipe — ожидание из канала. сервером подключения клиента к WriteFile — запись данных в экземпляру именованного канала.
канал. CallNamedPipe — подключение клиента к серверу.
WaitNamedPipe — ожидание появления именованного канала (клиент).
TransactNamedPipe — объединение возможностей чтения и записи в канал.
Создание анонимного канала
Анонимный канал может применяться для перенаправления ввода-вывода какой-либо программы. Т. е. ввод-вывод одной программы
перенаправляется |
|
специальной программой, которая |
|||||||||
использует анонимный канал. |
|
|
|
|
|||||||
|
|
|
|
|
может |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
Процесс |
2. |
||
Процесс 1. |
|
IN |
|
|
|
IN |
|
||||
|
|
|
|
|
|
1. Создание |
анонимного |
||||
3. Ввод двух чисел из |
|
|
|
|
|
|
канала. |
||||
|
IN. |
|
|
|
|
|
|
|
|
2. Вывод двух чисел в |
|
4. Вывод их суммы в |
|
|
|
|
|
|
|
|
OUT. |
||
|
OU |
|
|
|
|
OU |
|
||||
OUT. |
|
|
|
|
|
|
5. Получение их суммы |
||||
|
|
|
T |
|
|
|
|
T |
|
из IN. |
|
|
|
|
|
|
|
|
|
||||
Создание анонимного канала
Напишем простую программу, ввод-вывод которой мы будем перенаправлять. Назовем её “client” (client.exe).
#include <stdio.h> int main () {
int x, y;
scanf("%d%d",&x, &y); /* Получаем два числа
*/
printf("%d", x + y); /* Выводим их сумму */ return 0;
}
Создание анонимного канала
#include <stdio.h> |
|
#include <string.h> |
А теперь создадим программу |
#include <locale.h> |
|
#include <windows.h> |
перенаправления |
#define CLIENT_FILE "client.exe" /* EXE файл клиента: пред. программа */ int main() {
setlocale(LC_ALL, "Russian"); /* Русский язык */ char buf[1024]; /* Буфер чтения и записи */ SECURITY_ATTRIBUTES sa; /* Для CreatePipe */ PROCESS_INFORMATION pi; /* Для CreateProcess */ HANDLE newstdread, newstdwrite; /* Дескрипторы */
sa.nLength = sizeof(sa); /* Записываем размер структуры в параметр структуры */ sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE; /* Наследование */ /* Создаем канал */
if (!CreatePipe(&newstdread, &newstdwrite, &sa, 0)) { printf("Ошибка %d. Канал не создан.\n", GetLastError()); getchar();
return 0;
}
else printf("Канал создан!\n");
Создание анонимного канала
STARTUPINFO si = {sizeof(si)}; /* Структура для CreateProcess */ ZeroMemory(&si, sizeof(STARTUPINFO)); /* Очистка */
/* Далее настройка информации о процессе */ si.cb = sizeof(STARTUPINFO);
si.dwFlags = STARTF_USESTDHANDLES | STARTF_USESHOWWINDOW; si.wShowWindow = SW_NORMAL;
si.hStdInput = newstdread; /* Перенаправляем поток ввода */ si.hStdOutput = newstdwrite; /* Перенаправляем поток вывода */ si.hStdError = si.hStdOutput; /* Перенаправляем поток ошибок */ TCHAR czCommandLine[] = CLIENT_FILE; /* client.exe */
/* Создаем процесс */
if (!CreateProcess(NULL, czCommandLine, NULL, NULL, TRUE, CREATE_NEW_CONSOLE, NULL, NULL, &si, &pi)) {
printf("Ошибка %d. Процесс не создан.\n", GetLastError()); getchar();
CloseHandle(newstdread);
CloseHandle(newstdwrite); return 0;
}
else
printf("Процесс создан!\n");
Создание анонимного канала
unsigned long with_file; /* Доп. информация */
printf("STD INPUT PHANDLE = %d\n", newstdread); printf("STD OUTPUT PHANDLE = %d\n", newstdwrite);
strcpy(buf,"330 330\n"); /* Два числа отправляем в поток ввода клиента */ WriteFile(newstdwrite, buf, strlen(buf), &with_file, NULL); /* Отправляем информацию
клиенту */
Sleep(100); /* Чуть-чуть спим: может там операция сложная? */ memset(buf, '\0', sizeof(buf));
ReadFile(newstdread, buf, 100, &with_file, NULL); /* Читаем результат */
Открываем программу перенаправлени printf("Результат: %s\n", buf); /* Выводим результат */
Она запускает client.exe и передает парам
TerminateProcess(pi.hProcess,0); /* Закрываем процесс */ printf("Процесс завершен!\n");
CloseHandle(pi.hThread); /* Закрываем дескрипторы */ CloseHandle(pi.hProcess); /* Закрываем дескрипторы */ CloseHandle(newstdread); /* Закрываем дескрипторы */ CloseHandle(newstdwrite); /* Закрываем дескрипторы */ getchar(); /* Пауза перед выходом */
return 0;
}
Отображение информации в Process Explorer 

Анонимный канал
Дочерний процесс: клиент
