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



         

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


{$i q.inc}

(* Инициализация очереди - получить идентификатор очереди *)

function init_queue:longint;

var

  queue_id:longint;

begin

  (* Попытка создания или открытия очереди сообщений *)

  queue_id := msgget (QKEY, IPC_CREAT or QPERM);

  if queue_id = -1 then

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

  init_queue:=queue_id;

end;

Следующая процедура, serve, используется серверным процессом для получения сообщений из очереди и противоположна процедуре

enter.

{$i q.inc}

(* Процедура serve - принимает и обрабатывает сообщение обслуживает

 * объект очереди с наивысшим приоритетом

 *)

function serve:integer;

var

  r_qid:longint;

  r_entry:q_entry;

begin

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

  r_qid := init_queue;

  if r_qid = -1 then

  begin

    serve:=-1;

    exit;

  end;

  (* Получить и обработать следующее сообщение *)

  while true do

  begin

    if not msgrcv(r_qid, @r_entry, MAXOBN, -1*MAXPRIOR, MSG_NOERROR) then

    begin

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

      serve:=-1;

      exit;

    end

    else

    begin

      (* Обработать имя объекта *)

      proc_obj (@r_entry);

    end;

  end;

end;

Обратите внимание на вызов msgrcv. Так как в качестве параметра типа задано отрицательное значение (-1 * MAXPRIOR), то система вначале проверяет очередь на наличие сообщений со значением

mtype равным 1, затем равным 2 и так далее, до значения MAXPRIOR включительно. Другими словами, сообщения с наименьшим номером будут иметь наивысший приоритет. Процедура proc_obj работает с объектом. Для системы печати она может просто копировать файл на принтер.

Две следующих простых программы демонстрируют взаимодействие этих процедур: программа etest помещает элемент в очередь, а программа stest обрабатывает его (в действительности она всего лишь выводит содержимое и тип сообщения).




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