Получение номера задачи
Получение номера задачи
Следующие три программы представляют три отдельные функции управления задачами. Все эти функции включены в единый файл 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;
}
Более 800 000 книг и аудиокниг! 📚
Получи 2 месяца Литрес Подписки в подарок и наслаждайся неограниченным чтением
ПОЛУЧИТЬ ПОДАРОКЧитайте также
21.10. Отправка и получение
21.10. Отправка и получение Программа для получения анонсов сеанса многоадресной передачи, показанная в предыдущем разделе, могла только получать дейтаграммы многоадресной передачи. Теперь мы создадим простую программу, способную и отправлять, и получать дейтаграммы
23.7. Получение адресов
23.7. Получение адресов Поскольку протокол SCTP ориентирован на многоинтерфейсные узлы, для определения адресов локального и удаленного узла не могут использоваться те же механизмы, что и в TCP. В этом разделе мы изменим код клиента, добавив в него подписку на уведомление о
Получение ящика
Получение ящика Следует отметить, что ситуация с бесплатным ящиком кардинально отличается от «бесплатного сыра». На самом деле, этот сервис в Сети довольно распространен и функционально практически не отличается от платного. Возможно, работает чуть менее надежно, а в
6.3. Получение помощи
6.3. Получение помощи При работе с программой Midnight Commander практически в любой момент можно обратиться к интерактивной подсказке, вызов которой осуществляется нажатием клавиши ‹F1›. Подсказка организована как гипертекст, т. е. в ее тексте встречаются гипертекстовые ссылки
Получение почты
Получение почты Ничего принципиально нового в вопросах получения и отправки сообщений по сравнению с предыдущим уроком здесь нет. Так что знакомство с программой пройдет в теплой и дружественной обстановке. Приступим.Чтобы получить почту, необходимо нажать кнопку
Получение помощи
Получение помощи Мы очень старались сделать информацию в этой книге и на прилагающемся к ней компакт-диске максимально точной. Если у вас возникнут проблемы, обратитесь за помощью к указанным ниже
14.3 Получение справки
14.3 Получение справки Начинающих пользователей Linux очень часто любят пугать так называемыми манами. Дело в том, что man — это система справки о командах для терминала. Пользоваться ей очень легко, просто наберите в терминалеman командаНапример:man lsПоявится собственно текст
Получение статистики
Получение статистики Существует много способов получить статистику Почти все универсальные инструменты, перечисленные в приложении "Инструменты администратора и разработчика InterBase", позволяют получить статистику базы данных с помощью нескольких нажатий мыши, однако
Получение разрезов
Получение разрезов Команда SLICE осуществляет построение нового тела путем разрезания какого-либо существующего тела плоскостью (рис. 17.3). Команда вызывается из падающего меню Modify ? 3D Operations ? Slice. Рис. 17.3. Формирование разрезаЗапросы команды SLICE: Select objects to slice: – выбрать
ICQ: установка и получение собственного номера. Обмен сообщениями
ICQ: установка и получение собственного номера. Обмен сообщениями Аббревиатура ICQ имеет англоязычное происхождение. Строго говоря, это не совсем аббревиатура. Просто данное сочетание букв произносится так же, как и английское словосочетание I seek you – «Я ищу тебя».
Получение приоритета
Получение приоритета В более сложных выражениях, включающих несколько знаков операций, VBA нужно знать, какие операции выполнять первыми, вторыми, а какие третьими. В выражении intA + intB * intC два знака операций: + (операция сложения) и * (операция умножения). На русском это
1.1. Получение и установка GCC
1.1. Получение и установка GCC ПроблемаВы хотите получить GCC — свободно распространяемый компилятор GNU C/С++.РешениеРешение зависит от вашей операционной системы.WindowsУстановите MinGW, Cygwin или оба.Чтобы установить MinGW, посетите страницу MinGW по адресу www.mingw.org и проследуйте по
Компьютерра №33 (605) Тема номера: Выставки ТЕМА НОМЕРА SIGGRAPH 2005
Компьютерра №33 (605) Тема номера: Выставки ТЕМА НОМЕРА SIGGRAPH 2005 В начале августа в Лос-Анджелесе прошла выставка SIGGRAPH 2005. Полное название этого мероприятия звучит следующим образом: 32-я Международная конференция по компьютерной графике и интерактивным технологиям
4.1.3. Получение почты
4.1.3. Получение почты Для работы с письмами удобно использовать кнопки на панели инструментов (рис. 4.5), каждая кнопка имеет подсказку, по которой становится понятным ее действие. Итак, для получения почты необходимо выполнить следующие действия:1. Нажать на кнопку
Получение почты
Получение почты Получение почты осуществляется путем нажатия на кнопку Доставить. Все письма поступят в папку Входящие. Щелкая по заголовкам писем в окне заголовков, вы можете просматривать все письма подряд или на выбор. При этом заголовки писем, которые вы еще не