Функция RXQUEUE
Функцию RxQueue используйте в процедуре REXX для создания и удаления очередей, а также для назначения и опроса имен этих очередей. Первый параметр определяет функцию, которая должна быть выполнена; имя функции указывайте полностью, строчными или прописными буквами.
Синтаксис:
Параметры:
Create | Создает очередь с именем, определяемым аргументом имя-очереди (если этот аргумент указан); если же имя не указано, то REXX сам определяет имя очереди. В любом случае в качестве результата возвращает имя созданной очереди. | ||||||||||||
Delete | Удаляет поименованную очередь; в случае успешного удаления возвращает значение 0, в случае ошибки возвращает ненулевой результат; возможные результирующие значения перечислены ниже:
| ||||||||||||
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 /* восстанавливает имя очереди (не требуется)*/
Специальные соображения
- Внешние программы, которые должны взаимодействовать с процедурой REXX с помощью определенных очередей данных, могут использовать сеансовую очередь, очередь, принимаемую по умолчанию, либо получить имя очереди данных с помощью технологии межзадачного взаимодействия. Данная технология может включать передачу параметров, помещение в заранее подготовленную логическую очередь или использовать обычный механизм межзадачного взаимодействия OS/2 (например, каналы, разделенная память или очереди IPC).
- Поименованные очереди доступны для всей операционной системы; поэтому и имена очередей должны быть уникальными. Если существует очередь с именем os2que и выдана следующая функция: newqueue = RXQUEUE('Create', 'os2que')
то будет создана новая очередь, и имя для нее выберет REXX. Это новое имя будет возвращено в качестве результата выполнения функции.
- Любая запущенная внешняя программа наследует в качестве очереди, принимаемой по умолчанию, очередь, используемую в данный момент вызывающей программой.
Отсоединенные процессы
- Отсоединенные процессы получают доступ к отсоединенной сеансовой очереди, которая уникальна для каждого отсоединенного процесса. Важно отметить, что эта отсоединенная сеансовая очередь отличается от сеансовой очереди запущенного процесса.
- Процедуры REXX, которые должны выполняться как отсоединенные процессы, не могут использовать инструкции SAY, PULL и PARSE PULL, требующие ввода с клавиатуры или вывода на экран дисплея. Однако инструкции PULL и PARSE PULL, работающие только с очередью, допустимы для использования в отсоединенных процессах.
Примечания по мультипрограммированию
Механизм организации очередей данных в этом случае отличается от стандартного механизма организации очередей API операционной системы OS/2 следующим:
- Очередь НЕ принадлежит какому-то конкретному процессу, т.е. любой процесс имеет право в любой момент изменить очередь. При выполнении операций, которые могут повлиять на состояние очереди, ресурс преобразуется из параллельного в последовательный так, что не нарушается сохранность данных.
Однако синхронизация запросов ( когда два процесса, имеющие доступ к одной и той же очереди, получают данные из этой очереди в порядке регистрации их запросов) является обязанностью пользователя и не обеспечивается подсистемой. Данный селектор принадлежит вызывающей прикладной программе и должен быть освобожден этой программой с помощью DosFreeSeg.
- Стандартная очередь IPC операционной системы OS/2 принадлежит конкретному процессу (создается по его запросу). После завершения процесса очередь разрушается. В то же время очереди, созданные с помощью функции RxQueue('Create', имя-очереди) существуют до тех пор, пока не будут ЯВНО удалены. Завершение выполнения программы или процедуры, создавшей личную очередь, не влечет за собой принудительного удаления личной очереди. Любые данные в очереди после завершения процесса создания остаются в ней до тех пор, пока либо данная очередь не будет удалена (с помощью обращения к функции REXX RxQueue('Delete', имя-очереди), либо пока данные не будут прочитаны.
Очереди данных должны быть явно удалены некоторой процедурой или программой (не обязательно программой, создавшей очередь). Удаление очереди, в которой остались элементы, разрушает эти элементы. Если очередь не удалена, то она будет потеряна и ее невозможно будет восстановить, кроме как при случайной попытке получить доступ к каждой очереди в определенном порядке.