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



         

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


В этом разделе разработаем простое приложение для передачи сообщений. Его целью является реализация очереди, в которой для каждого элемента может быть задан приоритет. Серверный процесс будет выбирать элементы из очереди и обрабатывать их каким-либо образом. Например, элементы очереди могут быть именами файлов, а серверный процесс может копировать их на принтер. Этот пример аналогичен примеру использования FIFO из раздела 7.2.1.

Отправной точкой будет следующий заголовочный файл q.inc:

(* q.h - заголовок для примера очереди сообщений *)

const

  QKEY:tkey=(1 shl 6) + 5{0105};       (* ключ очереди *)

  QPERM=(6 shl 6) + (6 shl 3){0660};   (* права доступа *)

  MAXOBN=50;                           (* макс. длина имени объекта *)

  MAXPRIOR=10;                         (* максимальный приоритет *)

type

  q_entry=record

    mtype:longint;

    mtext:array [0..MAXOBN] of char;

  end;

  pq_entry=^q_entry;

Определение QKEY задает значение ключа, которое будет обозначать очередь сообщений в системе. Определение QPERM устанавливает связанные с очередью права доступа. Так как код доступа равен octal(0660), то владелец очереди и члены его группы смогут выполнять чтение и запись. Как увидим позже, определения MAXOBN и MAXPRIOR будут налагать ограничения на сообщения, помещаемые в очередь. Последняя часть этого включаемого файла содержит определение структуры q_entry. Структуры этого типа будут использоваться в качестве сообщений, передаваемых и принимаемых следующими процедурами.

Первая рассматриваемая процедура называется enter, она помещает в очередь имя объекта, заканчивающееся нулевым символом, и имеет следующую форму:

{$i q.inc}

(* Процедура enter - поместить объект в очередь *)

function enter (objname:string;priority:longint):boolean;

var

  len, s_qid:longint;

  s_entry:q_entry;     (* структура для хранения сообщений *)

begin

  (* Проверка длины имени и уровня приоритета *)

  len := length (objname);

  if len > MAXOBN then




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