Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Лабораторная работа1.doc
Скачиваний:
1
Добавлен:
11.08.2019
Размер:
69.63 Кб
Скачать
  • Параметр pvEnvironment

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

  • Параметр pszCurDir

Он позволяет родительскому процессу установить текущие диск и каталог для дочер него процесса. Если его значение — NULL, рабочий каталог нового процесса будет тем же, что и у приложения, его породившего. А если он отличен от NULL, то должен ука зывать на строку (с нулевым символом в конце), содержащую нужный диск и каталог. Заметьте, что в путь надо включать и букву диска.

  • Параметр psiStartlnfo

Этот параметр указывает на структуру STARTUPINFO:

typedef struct _STARTUPINFO { DWORD cb; PSTH lpReserved; PSTR lpDesktop; PSTR lpTitle; DWORD dwX; DWORD dwY;

DWORD dwXSize; DWORD dwYSize; DWORD dwXCountChars; DWORD dwYCountChars; DWORD dwFillAttribute; DWORD dwFlags; WORD wShowWindOw; WORD cbReserved2; PBYTE lpReserved2; HANDLE hStdInput; HANDLE hStdOutput; HANDLE hStdError; } STARTUPINFO, *LPSTARTUPINFO;

Элементы структуры STARTUPINFO используются Windows-функциями при созда нии нового процесса. Надо сказать, что большинство приложений порождает процес сы с атрибутами по умолчанию Но и в этом случае Вы должны инициализировать все элементы структуры STARTUPINFO хотя бы нулевыми значениями, а в элемент сb — заносить размер этой структуры:

STARTUPINFO si = { sizeof(si) }; CreateProcess(.. , &si, ...};

  • Параметр ppiProclnfo

Параметр ppiProcInfo указывает на структуру PROCESS_INFORMATION, которую Вы должны предварительно создать; ее элементы инициализируются самой функцией CreateProcess. Структура представляет собой следующее

typedef struct _PROCESS_INFORMATION { HANDLE hProcess; HANDLE hThread; DWORD dwProcessId; DWORD dwThreadId; } PROCESS_TNFORMATION;

1.2 Завершение процесса.

Процесс можно завершить четырьмя способами:

  • входная функция первичного потока возвращает управление (рекомендуемый способ),

  • один из потоков процесса вызывает функцию ExitProcess (нежелательный способ) - VOID ExilProcess(UINT fuExitCode);

  • поток другого процесса вызывает функцию TerminateProcess (тоже нежелательно) - BOOL TerminateProcess( HANDLE hProcoss, UINT fuExitCode);

  • все потоки процесса умирают по своей воле (большая редкость),

1.3 Дочерние процессы

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

PROCESS_INFORMATION pi; DWORD dwExitCode;

// порождаем дочерний процесс BOOL fSuccess = CreateProcess(..., &pi};

if (fSuccess) {

// закрывайте описатель потока, как только необходимость в нем отпадает! CloseHandle(pi hThread);

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

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

// закрывайте описатель процесса, как только необходимость в нем отпадает! CloseHandle(pi.hProcess);

}

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

2. Пример создания процесса:

#include <windows.h>

#include <stdio.h>

#include <tchar.h>

void _tmain( int argc, TCHAR *argv[] )

{

STARTUPINFO si;

PROCESS_INFORMATION pi;

ZeroMemory( &si, sizeof(si) );

si.cb = sizeof(si);

ZeroMemory( &pi, sizeof(pi) );

if( argc != 2 )

{

printf("Usage: %s [cmdline]\n", argv[0]);

return;

}

// Start the child process.

if( !CreateProcess( NULL, // No module name (use command line)

argv[1], // Command line

NULL, // Process handle not inheritable

NULL, // Thread handle not inheritable

FALSE, // Set handle inheritance to FALSE

0, // No creation flags

NULL, // Use parent's environment block

NULL, // Use parent's starting directory

&si, // Pointer to STARTUPINFO structure

&pi ) // Pointer to PROCESS_INFORMATION structure

)

{

printf( "CreateProcess failed (%d)\n", GetLastError() );

return;

}

// Wait until child process exits.

WaitForSingleObject( pi.hProcess, INFINITE );

// Close process and thread handles.

CloseHandle( pi.hProcess );

CloseHandle( pi.hThread );

}

3. Задание.

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