Вход на хостинг
IT-новости
20.04.2016 iPhone 2017 года поместят в водонепроницаемый корпус из стекла
Линейка iPhone в новом году серьезно поменяется. В этом уверен аналитический исследователь Мин Чи Ку......
30.07.2015 Ищем уникальный контент для сайта
Ищем уникальный контент для сайта Без уникального контента Ваш сайт обречен на то, что его страницы......
Всеволод Стахов
В данной статье я расскажу о работе с процессами в многозадачных операционных системах, в частности о программировании процессов и нитей в Windows и POSIX-совместимых системах.
Как вы знаете, Windows NT – это многозадачная ОС, а это значит, что вы можете создавать программным путём другие процессы и нити внутри процесса. Для создания процесса могут использоваться две основные функции: WinExec и CreateProcess. Первая очень проста в применении, имеет только два параметра и может использоваться для создания оконных процессов (к ним можно отнести и консольные программы). Однако возможности WinExec сильно ограничены, и Microsoft громогласно объявила, что вместо этого следует использовать функцию CreateProcess. Но рассмотреть WinExec всё же надо, хотя бы для быстрого написания простых программ.
int WinExec(char *command_line, unsigned int show_mode);
Функция выполняет программу сommand_line в режиме отображения окна show_mode и ждёт, пока дочерний процесс вызовет функцию GetMessage или пока не прошло время ожидания (это может вызвать задержку выполнения). При успешном выполнении функция возвращает значение, большее 31; меньшее значение сигнализирует об ошибке:
n 0 – не хватает ресурсов;
n ERROR_BAD_FORMAT – указываемый файл неисполняемый;
n ERROR_FILE_NOT_FOUND – указываемый файл не найден;
n ERROR_PATH_NOT_FOUND – путь не существует.
Режимы отображения окна будут описаны далее.
Функция CreateProcess принимает большое количество параметров и может использоваться для указания множества атрибутов порождаемым процессам, например, можно сделать оболочку для DOS-программы с графическим интерфейсом ввода/вывода данных, переопределив STDIN и STDOUT и многое другое. Но использовать данную функцию достаточно непросто, так как приходится учитывать некоторые нюансы, а можно ещё и мучиться с атрибутами безопасности, но это уже на любителя... Итак, вот что написано в MSDN:
BOOL CreateProcess(
// Имя исполняемого файла
LPCTSTR lpApplicationName,
// Командная строка
LPTSTR lpCommandLine,
// Атрибуты безопасности процесса
LPSECURITY_ATTRIBUTES lpProcessAttributes,
// Атрибуты безопасности потока
LPSECURITY_ATTRIBUTES lpThreadAttributes,
// Наследует ли дочерний процесс дескрипторы родителя
BOOL bInheritHandles,
// Флаги создания процесса
DWORD dwCreationFlags,
// Указатель на environment для дочернего процесса
LPVOID lpEnvironment,
// Текущая директория для процесса
LPCTSTR lpCurrentDirectory,