Получение номера задачи

Получение номера задачи

Следующие три программы представляют три отдельные функции управления задачами. Все эти функции включены в единый файл JobMgt.c, содержащий все исходные тексты.

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

Программа 6.4. JobMgt: создание информации о новой задаче 

/* Вспомогательная функция управления задачами. */

#include "EvryThng.h"

#include "JobMgt.h" /* Листинг приведен в приложении А. */

void GetJobMgtFileName (LPTSTR);

LONG GetJobNumber(PROCESS_INFORMATION *pProcessInfo, LPCTSTR Command)

/* Создать номер задачи для нового процесса и ввести информацию о новом процессе в базу данных задачи. */

{

 HANDLE hJobData, hProcess;

 JM_JOB JobRecord;

 DWORD JobNumber = 0, nXfer, ExitCode, FsLow, FsHigh;

 TCHAR JobMgtFileName[MAX_PATH];

 OVERLAPPED RegionStart;

 if (!GetJobMgtFileName(JobMgtFileName)) return –1;

 /* Предоставление результата в виде строки " mpUserName.JobMgt" */

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

 if (hJobData == INVALID_HANDLE_VALUE) return –1;

 /* Блокировать весь файл плюс одну возможную запись для получения исключительного доступа. */

 RegionStart.Offset = 0;

 RegionStart.OffsetHigh = 0;

 RegionStart.hEvent = (HANDLE)0;

 FsLow = GetFileSize(hJobData, &FsHigh);

 LockFileEx(hJobData, LOCKFILE_EXCLUSIVE_LOCK, 0, FsLow + SJM_JOB, 0, &RegionStart);

 __try {

  /* Чтение записи для нахождения пустого сегмента. */

  while(ReadFile(hJobData, &JobRecord, SJM_JOB, &nXfer, NULL) && (nXfer > 0)) {

   if (JobRecord.ProcessId == 0) break;

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

   if (hProcess == NULL) break;

   if (GetExitCodeProcess(hProcess, &ExitCode) && (ExitCode != STILL_ACTIVE)) break;

   JobNumber++;

  } 

  /* Либо найден пустой сегмент, либо мы находимся в конце файла и должны создать новый сегмент. */

  if (nXfer != 0) /* Не конец файла. Резервировать. */

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

  JobRecord.ProcessId = pProcessInfo->dwProcessId;

  _tcsnccpy(JobRecord.CommandLine, Command, MAX_PATH);

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

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

 __finally {

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

  CloseHandle(hJobData);

 }

 return JobNumber + 1;

}

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

Компьютерра №33 (605) Тема номера: Выставки ТЕМА НОМЕРА SIGGRAPH 2005

Из книги Журнал «Компьютерра» №33 от 13 сентября 2005 года автора Журнал «Компьютерра»

Компьютерра №33 (605) Тема номера: Выставки ТЕМА НОМЕРА SIGGRAPH 2005 В начале августа в Лос-Анджелесе прошла выставка SIGGRAPH 2005. Полное название этого мероприятия звучит следующим образом: 32-я Международная конференция по компьютерной графике и интерактивным технологиям


6.3. Получение помощи

Из книги Linux для пользователя автора Костромин Виктор Алексеевич

6.3. Получение помощи При работе с программой Midnight Commander практически в любой момент можно обратиться к интерактивной подсказке, вызов которой осуществляется нажатием клавиши ‹F1›. Подсказка организована как гипертекст, т. е. в ее тексте встречаются гипертекстовые ссылки


ICQ: установка и получение собственного номера. Обмен сообщениями

Из книги Работа в Интернете автора Макарский Дмитрий

ICQ: установка и получение собственного номера. Обмен сообщениями Аббревиатура ICQ имеет англоязычное происхождение. Строго говоря, это не совсем аббревиатура. Просто данное сочетание букв произносится так же, как и английское словосочетание I seek you – «Я ищу тебя».


Получение разрезов

Из книги AutoCAD 2009 для студента. Самоучитель автора Соколова Татьяна Юрьевна

Получение разрезов Команда SLICE осуществляет построение нового тела путем разрезания какого-либо существующего тела плоскостью (рис. 17.3). Команда вызывается из падающего меню Modify ? 3D Operations ? Slice. Рис. 17.3. Формирование разрезаЗапросы команды SLICE: Select objects to slice: – выбрать


Получение помощи

Из книги Microsoft Windows SharePoint Services 3.0. Русская версия. Главы 9-16 автора Лондер Ольга

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


Получение почты

Из книги Популярный самоучитель работы в Интернете автора Кондратьев Геннадий Геннадьевич

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


Получение ящика

Из книги Интернет – легко и просто! автора Александров Егор

Получение ящика Следует отметить, что ситуация с бесплатным ящиком кардинально отличается от «бесплатного сыра». На самом деле, этот сервис в Сети довольно распространен и функционально практически не отличается от платного. Возможно, работает чуть менее надежно, а в


Получение приоритета

Из книги VBA для чайников автора Каммингс Стив

Получение приоритета В более сложных выражениях, включающих несколько знаков операций, VBA нужно знать, какие операции выполнять первыми, вторыми, а какие третьими. В выражении intA + intB * intC два знака операций: + (операция сложения) и * (операция умножения). На русском это


1.1. Получение и установка GCC

Из книги C++. Сборник рецептов автора Диггинс Кристофер

1.1. Получение и установка GCC ПроблемаВы хотите получить GCC — свободно распространяемый компилятор GNU C/С++.РешениеРешение зависит от вашей операционной системы.WindowsУстановите MinGW, Cygwin или оба.Чтобы установить MinGW, посетите страницу MinGW по адресу www.mingw.org и проследуйте по


14.3 Получение справки

Из книги Руководство по переходу на Ubuntu 10.04 LTS «Lucid Lynx» автора Неворотин Вадим

14.3 Получение справки Начинающих пользователей Linux очень часто любят пугать так называемыми манами. Дело в том, что man — это система справки о командах для терминала. Пользоваться ей очень легко, просто наберите в терминалеman командаНапример:man lsПоявится собственно текст


4.1.3. Получение почты

Из книги Самоучитель работы на Macintosh автора Скрылина Софья

4.1.3. Получение почты Для работы с письмами удобно использовать кнопки на панели инструментов (рис. 4.5), каждая кнопка имеет подсказку, по которой становится понятным ее действие. Итак, для получения почты необходимо выполнить следующие действия:1. Нажать на кнопку


Получение статистики

Из книги Мир InterBase. Архитектура, администрирование и разработка приложений баз данных в InterBase/FireBird/Yaffil автора Ковязин Алексей Николаевич

Получение статистики Существует много способов получить статистику Почти все универсальные инструменты, перечисленные в приложении "Инструменты администратора и разработчика InterBase", позволяют получить статистику базы данных с помощью нескольких нажатий мыши, однако


Получение денег

Из книги Как сделать свой сайт и заработать на нем. Практическое пособие для начинающих по заработку в Интернете автора Мухутдинов Евгений


21.10. Отправка и получение

Из книги UNIX: разработка сетевых приложений автора Стивенс Уильям Ричард

21.10. Отправка и получение Программа для получения анонсов сеанса многоадресной передачи, показанная в предыдущем разделе, могла только получать дейтаграммы многоадресной передачи. Теперь мы создадим простую программу, способную и отправлять, и получать дейтаграммы


23.7. Получение адресов

Из книги Как приручить компьютер за несколько часов автора Ремнева Ирина

23.7. Получение адресов Поскольку протокол SCTP ориентирован на многоинтерфейсные узлы, для определения адресов локального и удаленного узла не могут использоваться те же механизмы, что и в TCP. В этом разделе мы изменим код клиента, добавив в него подписку на уведомление о


Получение почты

Из книги автора

Получение почты Получение почты осуществляется путем нажатия на кнопку Доставить. Все письма поступят в папку Входящие. Щелкая по заголовкам писем в окне заголовков, вы можете просматривать все письма подряд или на выбор. При этом заголовки писем, которые вы еще не