Что такое дочерние программы

Каждый процесс предоставляет ресурсы, необходимые для выполнения программы. Дочерний процесс — это процесс, созданный другим процессом, который называется родительским процессом.

Дополнительные сведения см. в следующих разделах:

  • Создание процессов
  • Настройка свойств окна с помощью STARTUPINFO
  • Дескрипторы и идентификаторы процессов
  • Перечисление процессов
  • Получение дополнительных сведений о процессе
  • Наследование
  • Переменные среды
  • Прекращение процесса
  • Рабочий набор процессов
  • Права на безопасность и доступ к процессам

Обратная связь

Были ли сведения на этой странице полезными?

Источник: learn.microsoft.com

Зачем нужны дочерние процессы

При разработке приложения часто бывает нужно, чтобы какую-то операцию выполнял другой блок кода. Поэтому приходится постоянно вызывать функции или подпрограммы. Но вызов функции приводит к приостановке выполнения основного кода программы до возврата из вызванной функции.

Дочерние темы в WordPress

Альтернативный способ — передать выполнение какой-то операции другому потоку в пределах данного процесса (поток, разумеется, нужно сначала создать). Это позволит основному коду программы продолжить работу в то время, как дополнительный поток будет выполнять другую операцию. Прием весьма удобный, но, когда основному потоку потребуется узнать результаты работы другого потока, Вам не избежать проблем, связанных с синхронизацией.

Есть еще один прием — процесс порождает дочерний процесс и возлагает на него выполнение части операций. Если Вы просто создаете новый поток внутри того же процесса, то при его тестировании можно получить некорректный результат — может, ошиблись в алгоритме или запутались в ссылках и случайно перезаписали какие-нибудь важные данные в адресном пространстве своего процесса. Один из способов защитить адресное пространство основного процесса от подобных ошибок как раз и состоит в том, чтобы передать часть работы отдельному процессу. Далее можно или подождать, пока он завершится, или продолжить работу параллельно с ним.

Часто дочернему процессу необходимы данные, содержащимися в адресном пространстве родительского процесса. Было бы неплохо, чтобы он работал исключительно в своем адресном пространстве, а из родительского просто считывал нужные ему данные, тогда он не сможет что-то испортить в адресном пространстве родительского процесса. В Windows предусмотрено несколько способов обмена данными между процессами.

Читайте также:
Порядок регистрации программ для эвм регулируются

Один из самых удобных способов, обеспечивающих совместный доступ

к данным, — использование файлов, проецируемых в память.

Если Вы хотите создать новый процесс, заставить его выполнить какие-либо операции и дождаться их результатов, напишите примерно такой код:

PROCESS_INFORMATION pinfo;

Уроки WinApi C++ | Работа с окнами виндовс | HWND на примерах


DWORD dwExitCode;

// порождаем дочерний процесс
BOOL success = CreateProcess(. ;

// закрывайте описатель потока, как только

// необходимость в нем отпадает!
CloseHandle(pinfo.hThread);

// приостанавливаем выполнение родительского процесса,
// пока не завершится дочерний процесс
WaitForSingleObject(pinfo.hProcess, INFINITE);

// дочерний процесс завершился; получаем код его завершения
GetExitCodeProcess(pinfo.hProcess,

// закрывайте описатель процесса, как только

// необходимость в нем отпадает!
CloseHandle(pinfo.hProcess);

В этом фрагменте кода создается новый процесс и, если это прошло успешно, вызывается функция WaitForSingleQbject :

DWORD WaitForSingleObject(HANDLE hObject, DWORD dwTimeOut);

Функция задерживает выполнение кода до тех пор, пока объект, определяемый параметром bObject , не перейдет в свободное (незанятое) состояние. Объект «процесс» переходит в такое состояние при его завершении. Поэтому вызов WaitForSingleObject приостанавливает выполнение потока родительского процесса до завершения порожденного им процесса.

Когда WaitForSingleObject вернет управление, можно узнать код завершения дочернего процесса через функцию GetExitCodeProcess .

Обращение к CloseHandle в приведенном выше фрагменте кода заставляет систему уменьшить значения счетчиков объектов «поток» и «процесс» до нуля и тем самым освободить память, занимаемую этими объектами.

Очень часто приложение создает другие процессы как обособленные. Это значит, что после создания и запуска нового процесса родительскому процессу нет нужды с ним взаимодействовать или ждать, пока тот закончит работу.

Чтобы обрубить все пуповины, связывающие с дочерним процессом, нужно вызовом CloseHandle закрыть свои описатели, связанные с новым процессом и его первичным потоком. Приведенный ниже фрагмент кода демонстрирует, как, создав процесс, сделать его обособленным:

BOOLsuccess = CreateProcess( ,
if (success)

// разрешаем системе уничтожить обьекты ядра «процесс» и «поток»
// сразу после создания дочернего процесса
CloseHandle(pinfo.hThread);
CloseHandle(pinfo.hProcess);

Читайте также:
Программа чтобы удалить все сообщения

Дата добавления: 2019-07-15 ; просмотров: 399 ; Мы поможем в написании вашей работы!

Источник: studopedia.net

Что такое дочерние программы

Процессы — примитивные модули для резервирования ресурсов системы. Каждый процесс имеет собственное адресное пространство. Процесс выполняет программу; Вы можете иметь многократные процессы, выполняющие ту же самую программу, но каждый процесс имеет собственную копию программы внутри собственного адресного пространства и выполняет это независимо от других копий.

Процессы организованы иерархически. Каждый процесс имеет родительский процесс. Процессы, созданные данным родителем называются дочерними процессами. Дочерний наследует многие из атрибутов родительского процесса. Эта глава описывает, как программа может создавать, завершать, и управлять дочерними процессами.

Фактически, имеются три различных операции: создание нового дочернего процесса, назначение новому процессу выполнить программу, и координирование завершения дочернего процесса. Функция системы обеспечивает простой механизм для выполнения другой программы; он делает все три шага автоматически. Если Вы нуждаетесь в большом количестве контроля, Вы можете использовать примитивные функции, чтобы делать каждый шаг индивидуально.

Простой способ выполнять другую программу состоит в том, чтобы использовать функцию system. Эта функция делает всю работу выполнения подпрограммы, но она не дает Вам контроля над подробностями: Вы должны ждать, пока подпрограмма не завершится прежде, чем Вы сможете делать что-нибудь еще.

int system (const char *command) (функция)

Эта функция выполняет command как команду оболочки. В библиотеке GNU C, она всегда использует заданную по умолчанию оболочку sh, чтобы выполнить команду. В частности она ищет каталоги в PATH, чтобы найти программу для выполнения. Возвращаемое значение -1, если не возможно создать процесс оболочки, иначе — состояние процесса оболочки.

См. Раздел 23.6 [Завершение Процесса], для подробностей относительно того, как этот код состояния может интерпретироваться. Функция system объявлена в заглавном файле » stdlib.h «. Примечание Переносимости: Некоторые реализации C могут не иметь понятие командного процессора, который может выполнять другие программы.

Вы можете определить, существует ли командный процессор, выполняя system (NULL); если возвращаемое значение отлично от нуля, командный процессор доступен. Popen и pclose функции (см. Раздел 10.2 [Трубопровод на Подпроцесса]) близко связаны функцией system. Они позволяют родительскому процессу связываться со стандартным вводом и выводом выполняемой команды.

Читайте также:
Методика разработки программ в основе которой лежит понятие объект это

Этот раздел дает краткий обзор действий и шагов по созданию процесса и выполнения им другой программы. Каждый процесс именован ID процесса. Уникальный ID процесса дан каждому процессу при создании. Процессы создаются системным вызовом fork (так что операция создания нового процесса иногда вызывает раздваивание процесса).

Дочерний процесс, созданный fork — точный аналог первоначального родительского процесса, за исключением того, что он имеет собственный ID. Если Вы хотите, чтобы ваша программа ждала завершения дочернего процесса, Вы должен делать это явно после операции fork, вызовом wait или waitpid (см. Раздел 23.6 [Завершение Процесса]).

Эти функции дают Вам ограниченную информацию относительно того, почему завершился дочерний прцесс — например, код состояния exit. Раздвоенный дочерний процесс продолжает выполнять ту же самую программу как родительский процесс, в точке возвращения fork.

Вы можете использовать возвращаемое значение от fork, чтобы отличить, выполняется ли программа в родительском процессе или в дочернем. Наличие нескольких процессов выполняющх ту же самую программу не очень полезно. Но дочерний может выполнять другую программу, используя одну из запускающих функций; см. Раздел 23.5 [Выполнение Файла].

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

Pid_t тип данных для ID процесса. Вы можете получить ID процесса, вызывая getpid. Функция getppid возвращает ID родителя текущего процесса (это также известно как ID родительского процесса). Ваша программа должна включить заглавные файлы » unistd.h » и » sys/types.h » чтобы использовать эти функции.

pid_t (тип данных)

Pid_t тип данных — целое число со знаком, который способен представить ID процесса. В библиотеке GNU, это — int.

pid_t getpid (void) (функция)
Getpid функция возвращает ID текущего процесса.
pid_t getppid (void) (функция)

Источник: www.opennet.ru

Рейтинг
( Пока оценок нет )
Загрузка ...
EFT-Soft.ru