Читаем Системное программирование в среде Windows полностью

Программа 11.1. pipe: межпроцессное взаимодействие с использованием анонимных каналов 

#include "EvryThng.h"

int _tmain(int argc, LPTSTR argv[])

/* Соединение двух команд с помощью канала в командной строке: pipe команда1 = команда2 */

{

 DWORD i = 0;

 HANDLE hReadPipe, hWritePipe;

 TCHAR Command1[MAX_PATH];

 SECURITY_ATTRIBUTES PipeSA = /* Для наследуемых дескрипторов. */

  {sizeof(SECURITY_ATTRIBUTES), NULL, TRUE};

 PROCESS_INFORMATION ProcInfo1, ProcInfo2;

 STARTUPINFO StartInfoCh1, StartInfoCh2;

 LPTSTR targv = SkipArg(GetCommandLine);

 GetStartupInfo(&StartInfoCh1);

 GetStartupInfo(&StartInfoCh2);

 /* Найти символ "=", разделяющий две команды. */

 while (*targv != '=' && *targv != '\0') {

  Command1[i] = *targv;

  targv++;

  i++;

 }

 Command1[i] = '\0';

 /* Пропуск до начала второй команды. */

 targv = SkipArg(targv);

 CreatePipe(&hReadPipe, &hWritePipe, &PipeSA, 0);

 /* Перенаправить стандартный вывод и создать первый процесс. */

 StartInfoCh1.hStdInput = GetStdHandle(STD_INPUT_HANDLE);

 StartInfoCh1.hStdError = GetStdHandle(STD_ERROR_HANDLE);

 StartInfoCh1.hStdOutput = hWritePipe;

 StartInfoCh1.dwFlags = STARTF_USESTDHANDLES;

 CreateProcess(NULL, (LPTSTR)Command1, NULL, NULL, TRUE /* Унаследовать дескрипторы. */, 0, NULL, NULL, &StartInfoCh1, &ProcInfo1);

 CloseHandle(ProcInfo1.hThread);

 /* Закрыть дескриптор записи канала, поскольку он больше не нужен, чтобы вторая команда могла обнаружить конец файла. */

 CloseHandle(hWritePipe);

 /* Повторить операции (симметричным образом) для второго процесса. */

 StartInfoCh2.hStdInput = hReadPipe;

 StartInfoCh2.hStdOutput = GetStdHandle(STD_OUTPUT_HANDLE);

 StartInfoCh2.hStdError = GetStdHandle(STD_ERROR_HANDLE);

 StartInfoCh2.dwFlags = STARTF_USESTDHANDLES;

 CreateProcess(NULL, (LPTSTR)targv, NULL, NULL, TRUE, 0, NULL, NULL, &StartInfoCh2, &ProcInfo2);

 CloseHandle(ProcInfo2.hThread);

 CloseHandle(hReadPipe);

 /* Ожидать завершения первого и второго процессов. */

 WaitForSingleObject(ProcInfo1.hProcess, INFINITE);

 CloseHandle(ProcInfo1.hProcess);

 WaitForSingleObject(ProcInfo2.hProcess, INFINITE);

 CloseHandle(ProcInfo2.hProcess);

 return 0;

}

<p>Именованные каналы</p>

Именованные каналы (named pipes) предлагают ряд возможностей, которые делают их полезными в качестве универсального механизма реализации приложений на основе IPC, включая приложения, требующие сетевого доступа к файлам, и клиент-серверные системы[31], хотя для реализации простых вариантов IPC, ориентированных на байтовые потоки, как в предыдущем примере, в котором взаимодействие процессов ограничивается рамками одной системы, анонимных каналов вам будет вполне достаточно. К числу упомянутых возможностей (часть которых обеспечивается дополнительно) относятся следующие:

• Именованные каналы ориентированы на обмен сообщениями, поэтому процесс, выполняющий чтение, может считывать сообщения переменной длины именно в том виде, в каком они были посланы процессом, выполняющим запись.

• Именованные каналы являются двунаправленными, что позволяет осуществлять обмен сообщениями между двумя процессами посредством единственного канала.

Перейти на страницу:

Похожие книги

Основы программирования в Linux
Основы программирования в Linux

В четвертом издании популярного руководства даны основы программирования в операционной системе Linux. Рассмотрены: использование библиотек C/C++ и стан­дартных средств разработки, организация системных вызовов, файловый ввод/вывод, взаимодействие процессов, программирование средствами командной оболочки, создание графических пользовательских интерфейсов с помощью инструментальных средств GTK+ или Qt, применение сокетов и др. Описана компиляция программ, их компоновка c библиотеками и работа с терминальным вводом/выводом. Даны приемы написания приложений в средах GNOME® и KDE®, хранения данных с использованием СУБД MySQL® и отладки программ. Книга хорошо структурирована, что делает обучение легким и быстрым. Для начинающих Linux-программистов

Нейл Мэтью , Ричард Стоунс , Татьяна Коротяева

ОС и Сети / Программирование / Книги по IT
1001 совет по обустройству компьютера
1001 совет по обустройству компьютера

В книге собраны и обобщены советы по решению различных проблем, которые рано или поздно возникают при эксплуатации как экономичных нетбуков, так и современных настольных моделей. Все приведенные рецепты опробованы на практике и разбиты по темам: аппаратные средства персональных компьютеров, компьютерные сети и подключение к Интернету, установка, настройка и ремонт ОС Windows, работа в Интернете, защита от вирусов. Рассмотрены не только готовые решения внезапно возникающих проблем, но и ответы на многие вопросы, которые возникают еще до покупки компьютера. Приведен необходимый минимум технических сведений, позволяющий принять осознанное решение.Компакт-диск прилагается только к печатному изданию книги.

Юрий Всеволодович Ревич

Программирование, программы, базы данных / Интернет / Компьютерное «железо» / ОС и Сети / Программное обеспечение / Книги по IT