Язык процедур 2-REXX для OS-2


Функция RXQUEUE


Функцию RxQueue используйте в процедуре REXX для создания и удаления очередей, а также для назначения и опроса имен этих очередей. Первый параметр определяет функцию, которая должна быть выполнена; имя функции указывайте полностью, строчными или прописными буквами.

Синтаксис:

Параметры:

Create    Создает очередь с именем, определяемым аргументом имя-очереди (если этот аргумент указан); если же имя не указано, то REXX сам определяет имя очереди. В любом случае в качестве результата возвращает имя созданной очереди.
Delete    Удаляет поименованную очередь; в случае успешного удаления возвращает значение 0, в случае ошибки возвращает ненулевой результат; возможные результирующие значения перечислены ниже:

   0    Очередь удалена.
   5    Неправильное имя очереди.
   9    Указанная очередь не существует.
   10    Очередь занята; подождите, пока она не станет активной.
   12    Произошла ошибка при обращении к памяти.
   1000    Ошибка инициализации; проверьте файл OS/2.INI
Get    Возвращает имя очереди, используемой в настоящий момент.
Set    Присваивает текущей очереди имя, указанное в аргументе новое-имя-очереди, и в качестве результата возвращает предыдущее имя данной очереди.

Пример: Простая очередь в процедуре REXX

/* */ /* push/pull БЕЗ мультипрограммной поддержки */ /* */ push date() time() /* помещает в очередь дату и время */ do 1000 /* пропускается промежуток времени */ nop /* нет операции */ end /* конец цикла */ pull a b . /* получает информацию из очереди */ say 'Pushed at ' a b ', Pulled at ' date() time() /* выводит время от времени */

/* */ /* push/pull С мультипрограммной поддержкой */ /* (без восстановления при ошибках и без проверки */ /* неподдерживаемых сред) */ newq = RXQUEUE('Create') /* создает единственную очередь */ oq = RXQUEUE('Set',newq) /* устанавливает новую очередь */ push date() time() /* помещает в очередь дату и время */ do 1000 /* пропускается промежуток времени */ nop /* нет операции */ end /* конец цикла */ pull a b . /* получает информацию из очереди */ say 'Pushed at ' a b ', Pulled at ' date() time() /* сообщает пользователю */ call RXQUEUE 'Delete',newq /* удаляет созданную очередь */ call RXQUEUE 'Set',oq /* восстанавливает имя очереди (не требуется)*/


Специальные соображения


  1. Внешние программы, которые должны взаимодействовать с процедурой REXX с помощью определенных очередей данных, могут использовать сеансовую очередь, очередь, принимаемую по умолчанию, либо получить имя очереди данных с помощью технологии межзадачного взаимодействия. Данная технология может включать передачу параметров, помещение в заранее подготовленную логическую очередь или использовать обычный механизм межзадачного взаимодействия OS/2 (например, каналы, разделенная память или очереди IPC).

  2. Поименованные очереди доступны для всей операционной системы; поэтому и имена очередей должны быть уникальными. Если существует очередь с именем os2que и выдана следующая функция: newqueue = RXQUEUE('Create', 'os2que')

    то будет создана новая очередь, и имя для нее выберет REXX. Это новое имя будет возвращено в качестве результата выполнения функции.

  3. Любая запущенная внешняя программа наследует в качестве очереди, принимаемой по умолчанию, очередь, используемую в данный момент вызывающей программой.


Отсоединенные процессы


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

  2. Процедуры REXX, которые должны выполняться как отсоединенные процессы, не могут использовать инструкции SAY, PULL и PARSE PULL, требующие ввода с клавиатуры или вывода на экран дисплея. Однако инструкции PULL и PARSE PULL, работающие только с очередью, допустимы для использования в отсоединенных процессах.


Примечания по мультипрограммированию

Механизм организации очередей данных в этом случае отличается от стандартного механизма организации очередей API операционной системы OS/2 следующим:


  1. Очередь НЕ принадлежит какому-то конкретному процессу, т.е. любой процесс имеет право в любой момент изменить очередь. При выполнении операций, которые могут повлиять на состояние очереди, ресурс преобразуется из параллельного в последовательный так, что не нарушается сохранность данных.



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

  2. Стандартная очередь IPC операционной системы OS/2 принадлежит конкретному процессу (создается по его запросу). После завершения процесса очередь разрушается. В то же время очереди, созданные с помощью функции RxQueue('Create', имя-очереди) существуют до тех пор, пока не будут ЯВНО удалены. Завершение выполнения программы или процедуры, создавшей личную очередь, не влечет за собой принудительного удаления личной очереди. Любые данные в очереди после завершения процесса создания остаются в ней до тех пор, пока либо данная очередь не будет удалена (с помощью обращения к функции REXX RxQueue('Delete', имя-очереди), либо пока данные не будут прочитаны.


Очереди данных должны быть явно удалены некоторой процедурой или программой (не обязательно программой, создавшей очередь). Удаление очереди, в которой остались элементы, разрушает эти элементы. Если очередь не удалена, то она будет потеряна и ее невозможно будет восстановить, кроме как при случайной попытке получить доступ к каждой очереди в определенном порядке.

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