Системное программирование в UNIX средствами Free Pascal



         

Пример передачи сообщений: очередь с приоритетами - часть 2


  begin

    warn ('слишком длинное имя');

    enter:=false;

    exit;

  end;

  if (priority > MAXPRIOR) or (priority < 0) then

  begin

    warn ('недопустимый уровень приоритета');

    enter:=false;

    exit;

  end;

  (* Инициализация очереди сообщений, если это необходимо *)

  s_qid := init_queue;

  if s_qid = -1 then

  begin

    enter:=false;

    exit;

  end;

  (* Инициализация структуры переменной s_entry *)

  s_entry.mtype := priority;

  strlcopy (s_entry.mtext, @objname[1], MAXOBN);

  (* Посылаем сообщение, выполнив ожидание, если это необходимо *)

  if not msgsnd (s_qid, @s_entry, len, 0) then

  begin

    perror ('Ошибка вызова msgsnd');

    enter:=false;

    exit;

  end

  else

    enter:=true;

end;

Первое действие, выполняемое процедурой

enter, заключается в проверке длины имени объекта и уровня приоритета. Обратите внимание на то, что минимальное значение переменной приоритета priority равно 1, так как нулевое значение приведет к неудачному завершению вызова msgsnd. Затем процедура enter «открывает» очередь, вызывая процедуру init_queue, реализацию которой приведем позже.

После завершения этих действий процедура формирует сообщение и пытается послать его при помощи вызова msgsnd. Здесь для хранения сообщения использована структура s_entry типа q_entry, и последний параметр вызова msgsnd равен нулю. Это означает, что система приостановит выполнение текущего процесса, если очередь заполнена (так как не задан флаг IPC_NOWAIT).

Процедура enter сообщает о возникших проблемах при помощи функции warn или библиотечной функции perror. Для простоты функция warn реализована следующим образом:

procedure warn (s:pchar);

begin

  writeln(stderr, 'Предупреждение: ', s);

end;

В реальных системах функция warn должна записывать сообщения в специальный файл протокола.

Назначение функции init_queue очевидно. Она инициализирует идентификатор очереди сообщений или возвращает идентификатор очереди сообщений, который с ней уже связан.




Содержание  Назад  Вперед