Поиск задачи в файле списка задач
Поиск задачи в файле списка задач
Программа 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;
}