Добавил:
СПбГУТ * ИКСС * Программная инженерия Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
АОПИ. Старое / Презентация. Механизмы ядра. Часть 2.pptx
Скачиваний:
74
Добавлен:
20.09.2019
Размер:
4.94 Mб
Скачать
/* SpecFunc — наша функция */
if (bSuccess) /* Если успешно, то */ for (i = 1; i <= 3; i++) {
/* Три раза подряд ждем срабатывания таймера (период: 1 секунда) */ SleepEx(INFINITE, TRUE);
} Спустя 5 секунд else /* Если ошибка, то */ + 1 секунда
printf("SetWaitableTimer failed with error %d\n", GetLastError());+ 1 секунда
}
else /* Если ошибка, то */
printf("CreateWaitableTimer failed with error %d\n", GetLastError()); /* Если тут вызвать SleepEx, то таймер снова сработает */
/* Выключим его, чтобы он больше не срабатывал */ CancelWaitableTimer(hColTimer); /* Здесь следует делать проверку */ CloseHandle(hColTimer); /* Закрываем дескриптор */
getchar(); getchar(); /* Ждем ввода пользователя */ return 0;

Создание относительного таймера ожидания

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

Анонимный канал

Дочерний процесс: клиент