Программа LOGLOCK
Программа LOGLOCK (листинг 24) демонстрирует использование логических записей для синхронизации процессов.
Вначале программа запрашивает в цикле у оператора имена логических записей и добавляет их в набор. Цикл добавления записей завершается, когда оператор вводит символ "-". Затем программа выполняет попытку заблокировать группу записей.
Вы можете запустить эту программу одновременно на двух рабочих станциях. При попытке заблокировать уже заблокированную ранее логическую запись программа перейдет в состояние ожидания.
Перед завершением своей работы программа LOGLOCK разблокирует записи и удалит набор.
// =================================================== // Листинг 24. Блокирование логических записей // Файл loglock\loglock.cpp // // (C) A. Frolov, 1993 // ===================================================
#include <stdlib.h> #include <stdio.h> #include <string.h> #include <conio.h>
#define BYTE unsigned char #define WORD unsigned int
extern "C" int GetNetWareShellVersion(char *,char *, char *); extern "C" int LogLogicalRecord(char *, BYTE, WORD); extern "C" int LockLogicalRecordSet(WORD); extern "C" void ReleaseLogicalRecordSet(void); extern "C" void ClearLogicalRecordSet(void);
void main(void) {
char MajorVersion=0; char MinorVersion=0; char Revision=0;
char LogicalRecordName[100];
int ccode;
printf("\n*LOGLOCK* (C) Frolov A., 1993\n");
// Проверяем наличие сетевой оболочки
asm push si GetNetWareShellVersion(&MajorVersion, &MinorVersion, &Revision); asm pop si
if(MajorVersion == 0) { printf("\nОболочка NetWare не загружена\n"); return; }
// Создаем набор логических записей, которые будут заблокированы
for(;;) { printf("\nВведите имя логической записи или '-':"); gets(LogicalRecordName);
if(LogicalRecordName[0] == '-') break;
// Добавляем логическую запись в набор
ccode = LogLogicalRecord(LogicalRecordName, 0, 0);
if(!ccode) printf("Логическая запись %s добавлена к списку\n", LogicalRecordName); else printf("Ошибка при добавлении %02.2X\n", ccode); }
// Блокируем набор логических записей
ccode = LockLogicalRecordSet(0);
if(!ccode) printf("Логические записи заблокированы\n"); else printf("Ошибка при блокировании " "логических записей %02.2X\n", ccode);
printf("Для разблокирования логических записей " " нажмите любую клавишу\n"); getch();
// Разблокируем набор логических записей
ReleaseLogicalRecordSet();
// Удаляем набор логических записей
ClearLogicalRecordSet(); }