Вход/Регистрация
Системное программирование в среде Windows
вернуться

Харт Джонсон М.

Шрифт:

if (JobRecord.ProcessId == 0) continue; 

hProcess = OpenProcess(PROCESS_ALL_ACCESS, FALSE, JobRecord.ProcessId);

if (hProcess != NULL) GetExitCodeProcess(hProcess, &ExitCode);

_tprintf(_T(" [%d] "), JobNumber);

if (hProcess == NULL) _tprintf(_T(" Готово"));

else if (ExitCode != STILL_ACTIVE) _tprintf(_T("+ Готово"));

else _tprintf(_T(" "));

_tprintf(_T(" %s\n"), JobRecord.CommandLine);

/* Удалить процессы, которые в системе уже не присутствуют. */

if (hProcess == NULL) {

/* Зарезервировать одну запись. */

SetFilePointer(hJobData, –(LONG)nXfer, NULL, FILE_CURRENT);

JobRecord.ProcessId = 0;

WriteFile(hJobData, &JobRecord, SJM_JOB, &nXfer, NULL);

}

} /* Конец цикла while. */

 } /* Конец __try-блока. */

 __finally {

UnlockFileEx(hJobData, 0, FsLow, FsHigh, &RegionStart);

CloseHandle(hJobData);

 }

 return TRUE;

}

Поиск задачи в файле списка задач

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

Программа 6.6. JobMgt: получение идентификатора процесса по номеру задачи 

DWORD FindProcessId(DWORD JobNumber)

/* Получить ID процесса для задачи с указанным номером. */

{

 HANDLE hJobData;

 JM_JOB JobRecord;

 DWORD nXfer;

 TCHAR JobMgtFileName[MAX_PATH];

 OVERLAPPED RegionStart;

 /* Открыть файл управления задачами. */

 GetJobMgtFileName(JobMgtFileName);

 hJobData = CreateFile(JobMgtFileName, GENERIC_READ, FILE_SHARE_READ | FILE_SHARE_WRITE, NULL, OPEN_EXISTING, FILE_ATTRIBUTE_NORMAL, NULL);

 if (hJobData == INVALID_HANDLE_VALUE) return 0;

 /* Перейти к позиции записи, соответствующей указанному номеру задачи.

* В полной версии программы обеспечивается принадлежность номера задачи (JobNumber) допустимому диапазону значений. */

 SetFilePointer(hJobData, SJM_JOB * (JobNumber – 1), NULL, FILE_BEGIN);

 /* Блокировка и чтение записи. */

 RegionStart.Offset = SJM_JOB * (JobNumber – 1);

 RegionStart.OffsetHigh =0; /* Предполагаем, что файл "короткий". */

 RegionStart.hEvent = (HANDLE)0;

 LockFileEx(hJobData, 0, 0, SJM_JOB,0, &RegionStart);

 ReadFile(hJobData, &JobRecord, SJM_JOB, &nXfer, NULL);

 UnlockFileEx(hJobData, 0, SJM_JOB, 0, &RegionStart);

 CloseHandle(hJobData);

 return JobRecord.ProcessId;

}
 

Объекты задач

Процессы можно объединять в объекты задач (job objects), что позволяет управлять процессами как группой, устанавливать лимиты ресурсов для всех процессов, входящих в объект задачи, и вести учетную информацию. Объекты задач были впервые введены в Windows 2000 и теперь поддерживаются во всех системах NT5.

Первым шагом является создание пустого объекта задачи с помощью функции CreateObject, которая принимает два аргумента, имя и атрибуты защиты, и возвращает дескриптор объекта задачи. Существует также функция OpenJobObject, которую можно применять к именованным объектам задач. Для уничтожения объектов используется функция CloseHandle.

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

  • Читать дальше
  • 1
  • ...
  • 89
  • 90
  • 91
  • 92
  • 93
  • 94
  • 95
  • 96
  • 97
  • 98
  • 99
  • ...

Ебукер (ebooker) – онлайн-библиотека на русском языке. Книги доступны онлайн, без утомительной регистрации. Огромный выбор и удобный дизайн, позволяющий читать без проблем. Добавляйте сайт в закладки! Все произведения загружаются пользователями: если считаете, что ваши авторские права нарушены – используйте форму обратной связи.

Полезные ссылки

  • Моя полка

Контакты

  • chitat.ebooker@gmail.com

Подпишитесь на рассылку: