Локальные сети персональных компьютеров. Работа с сервером Novell NetWare

       

Программа SEMSIGN


Программа SEMSIGN (листинг 25) демонстрирует использование семафоров.

Эта программа открывает семафор с именем SEMLOCK, определяет его состояние. Вся информация, касающаяся семафора, выводится в стандартный поток вывода. Затем с помощью функции WaitOnSemaphore() программа запрашивает доступ к критическому ресурсу. После того как оператор нажмет любую клавишу, программа вызывает функцию SignalSemaphore(), освобождающую ресурс, и закрывает семафор.

Вы можете запустить эту программу сначала на одной станции. Затем, после того как критический ресурс будет получен, запустите эту же программу на другой станции. Так как первая программа еще не освободила ресурс, вторая не сможет получить к нему доступа.

Если вы завершите работу первой программы в течение 20 секунд, вторая программа получит доступ к ресурсу, если нет - она завершится с сообщением о том, что ресурс занят.

// =================================================== // Листинг 25. Работа с семафорами // Файл semsign\semsign.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 OpenSemaphore(char *, int, long *, WORD *); extern "C" int CloseSemaphore(long); extern "C" int ExamineSemaphore(long, int *, WORD *); extern "C" int SignalSemaphore(long); extern "C" int WaitOnSemaphore(long, WORD);

void main(void) {

char MajorVersion=0; char MinorVersion=0; char Revision=0;

int ccode; long SemaphoreHandle; WORD OpenCount; int SemaphoreValue;

printf("\n*SEMSIGN* (C) Frolov A., 1993\n");

// Проверяем наличие сетевой оболочки

asm push si GetNetWareShellVersion(&MajorVersion, &MinorVersion, &Revision); asm pop si



if(MajorVersion == 0) { printf("\nОболочка NetWare не загружена\n"); return; }


// Открываем семафор с именем SEMLOCK

ccode = OpenSemaphore("SEMLOCK", 1, &SemaphoreHandle, &OpenCount);

if(!ccode) { printf("Семафор SEMLOCK открыт\n"); printf("Handle = %ld, OpenCount = %d\n", SemaphoreHandle, OpenCount); } else { printf("Ошибка при открытии семафора " "SEMLOCK %02.2X\n", ccode); return; }

// Определяем текущее состояние семафора

ccode = ExamineSemaphore(SemaphoreHandle, &SemaphoreValue, &OpenCount);

if(!ccode) { printf("SemaphoreValue = %d\n", SemaphoreValue); } else printf(" Ошибка при получении состояния семафора " "SEMLOCK %02.2X\n", ccode);

// Запрашиваем доступ к критическому ресурсу, // ожидаем получение доступа в течение 20 секунд

printf("Запрашиваем доступ к критическому ресурсу...\n");

ccode = WaitOnSemaphore(SemaphoreHandle, 18*20);

if(!ccode) { printf("Доступ к критическому ресурсу получен\n"); } else { printf("Ресурс заблокирован, ошибка %02.2X\n", ccode); return; }

// Теперь, если мы получили доступ к ресурсу, можно выполнять с ним // необходимые действия. В нашей программе мы ничего не делаем, // просто ожидаем, пока оператор не нажмет любую клавишу

printf("Нажмите любую клавишу для освобожения ресурса\n"); getch();

// Освобождаем ресурс

ccode = SignalSemaphore(SemaphoreHandle);

if(!ccode) { printf("Ресурс освобожден\n"); } else printf("Ошибка при освобождении ресурса %02.2X\n", ccode);

// Закрываем семафор

ccode = CloseSemaphore(SemaphoreHandle);

if(!ccode) printf("Семафор SEMLOCK закрыт\n"); else printf("Ошибка при закрытии семафора " "SEMLOCK %02.2X\n", ccode); }


Содержание раздела