

                           - 401 -

                        00152-01 97 06


       11.6.13. Секции образов


       Глобальные секции  могут  содержать  разделяемый  код.

  Операционная система МОС ВП  использует  глобальные  секции

  для реализации разделяемого кода следующим образом:

       1) об'ектный модуль, который содержит код,  подлежащий

  разделению, компонуется для создания  разделяемого  образа.

  Этот разделяемый образ сам по себе не является выполняемым.

  Он содержит ряд секций, называемых секциями образа;

       2) пользователь компонует личные  об'ектные  модули  с

  этим разделяемым образом для получения выполняемого образа.

  Никакие коды или данные из разделяемого образа не включают-

  ся в выполняемый образ;

       3) для того, чтобы сделать  секции  образа  доступными

  для разделения, системный администратор при помощи  команды

  INSTALL создает из  файла  разделяемого  образа  постоянную

  секцию;

       4) во время работы  выполняемого  образа  операционная

  система МОС ВП автоматически отображает глобальные  секции,

  созданные командой INSTALL, на виртуальное адресное  прост-

  ранство пользовательского процесса (документы [17] и [18]).



       11.6.14. Секции физических страниц


       Секция физических страниц -  это  одна  или  несколько

  смежных  страниц   физической   памяти   или   пространство

  ввода-вывода, которое  необходимо  отобразить  как  секцию.

  Секции физических страниц можно использовать для  отображе-




                           - 402 -

                        00152-01 97 06


  ния страницы ввода-вывода, что  позволяет  процессу  читать

  регистры  устройства.  Процесс,  отображенный  на  страницу

  ввода-вывода, может также подсоединяться к вектору прерыва-

  ний устройства.

       Секция физических страниц отличается от секции  диско-

  вого файла тем, что она не связана  ни  с  каким  отдельным

  файлом на диске и не выгружается. Однако она похожа на сек-

  цию дискового файла во многих отношениях. Пользователь соз-

  дает, отображает, определяет характеристики секции физичес-

  ких страниц в основном так же, как это делается для  секции

  дискового файла.

       Для  создания  секции  физических  страниц  необходимо

  задать номер физической страницы при помощи установки  бита

  SEC$M_PFNMAP в аргументе FLAGS служебной программы $CRMPSC.

  Аргумент VBN используется для создания первой  отображаемой

  физической страницы, а не первого виртуального блока. Поль-

  зовательская привилегия PFNMAP необходима для создания  или

  удаления секции  физических  страниц,  но  для  отображения

  существующей секции она не нужна.

       Поскольку данный тип секции не связан с файлом на дис-

  ке, то аргументы RELPAG, CHAN  и  PFC  служебной  программы

  $CRMPSC не используются при создании или отображении  физи-

  ческих страниц. По той  же  причине  неприменимы  установки

  битов SEC$M_CRF (ссылка на копию)  и  SEC$M_DZRO  (загрузка

  обнуленных страниц).

       При работе с секциями физических страниц нужно  соблю-

  дать осторожность. Если разрешается  запись  в  секцию,  то




                           - 403 -

                        00152-01 97 06


  каждый процесс, который туда  пишет,  делает  это  на  свой

  риск. Могут возникнуть серьезные ошибки, если процесс запи-

  сывает некорректные данные или  ошибочно  пишет  на  другую

  страницу, особенно если  эта  страница  отображается  также

  операционной системой МОС ВП или  другим  процессом.  Таким

  образом, пользователь,  имеющий  привилегию  PFNMAP,  может

  нарушить или разрушить защиту операционной системы МОС ВП.




     12. Служебные программы управления захватом ресурсов



       Служебные программы управления  захватом  операционной

  системы МОС ВП позволяют взаимосвязанным процессам  синхро-

  низировать их доступ к разделяемым ресурсам. Это достигает-

  ся путем обеспечения общей области данных, в  которой  про-

  цессы могут захватить указанный ресурс по имени.  Все  про-

  цессы,  которые  осуществляют  доступ  к  ресурсам,  должны

  использовать служебные программы управления захватом, иначе

  они не будут эффективными.

       Для того, чтобы синхронизировать  доступ  к  ресурсам,

  служебные программы управления захватом обеспечивают  меха-

  низм очередей, что позволяет процессам ожидать  в  очереди,

  пока конкретный ресурс не станет доступным.

       Системная программа $ENQ (поставить в  очередь  запрос

  на захват) используется для того, чтобы осуществлять запро-

  сы на захват, а системная служебная программа $DEQ (удалить

  из очереди запрос на захват) -  для  того,  чтобы  отменять

  запросы  на  захват.  Программа   системного   обслуживания



                           - 404 -

                        00152-01 97 06


  $GETLKI (получить информацию  о  захвате)  применяется  для

  получения информации о существующих захватах.



       12.1. Концепции ресурсов и захватов


       Ресурсом может быть все, что существует в операционной

  системе МОС ВП (например,  файлы,  структуры  данных,  базы

  данных и выполняемые программы). Если к одному  и  тому  же

  ресурсу осуществляют доступ два или несколько процессов, то

  часто возникает необходимость управлять их доступом к  дан-

  ному ресурсу. Нежелательно, чтобы один процесс читал ресурс

  в то время, как другой процесс пишет новые данные.  Записы-

  вающая программа может быстро испортить что-либо  из  того,

  что считывает читающая программа. Системные служебные прог-

  раммы управления захватом позволяют связать имя с  ресурсом

  и запросить доступ к этому ресурсу. Режимы  захвата  разре-

  шают процессам указать, как они хотят  разделять  доступ  с

  другими процессами.

       Процесс должен запрашивать доступ к ресурсу  (запраши-

  вать захват) при помощи системной служебной программы $ENQ.

  Для захватов системной служебной программе  $ENQ  требуется

  три аргумента:

       1) имя ресурса. Служебные программы управления  захва-

  том используют имя ресурса для того, чтобы  проверить,  нет

  ли других запросов на захват, использующих это же имя;

       2) режим захвата, соответствующий запрашиваемому  зах-

  вату. Режим захвата определяет, как процесс будет разделять

  ресурс с другими процессами;



                           - 405 -

                        00152-01 97 06


       3) адрес блока состояния захвата. Блок состояния  зах-

  вата получает код состояния выполнения захвата и  идентифи-

  кацию захвата. Идентификация захвата используется для обра-

  щения к запросу захвата после того, как он будет  поставлен

  в очередь.

       Служебные  программы  управления  захватом  сравнивают

  режим вновь запрашивамых захватов с режимом захвата  других

  захватов с тем же именем ресурса:

       1) если нет других процессов, имеющих  захват  данного

  ресурса, то новый захват предоставляется;

       2) если есть другой процесс,  имеющий  захват  данного

  ресурса, и режим нового запроса  совместим  с  существующим

  захватом, то новый захват предоставляется;

       3) если другой процесс уже захватил  ресурс,  и  режим

  нового запроса несовместим с режимом существующего захвата,

  то новый запрос ставится в очередь, где он ожидает, пока не

  станет доступным. Когда ресурс становится  доступным,  про-

  цесс извещают о том, что он  может  осуществлять  доступ  к

  данному ресурсу (захват предоставлен).

       Кроме того, процесс может использовать системную  слу-

  жебную программу $ENQ для  изменения  режима  захвата.  Это

  называется преобразованием захвата.



       12.1.1. Иерархичность захватов


       Многие ресурсы можно подразделить на меньшие части. До

  тех пор, пока часть ресурса можно идентифицировать  именем,

  эту часть можно захватить.



                           - 406 -

                        00152-01 97 06


       Рис. 45 иллюстрирует модель базы данных.  База  данных

  делится на файлы, которые в свою очередь подразделяются  на

  записи. Далее записи делятся на элементы.


                    Модель базы данных

                            Т о м
                           /      \
                        /            \
                     /                  \
                 Файл                    Файл
              /        \                    \
       Запись        Запись                Запись
      /     \        /     \               /    \
  Элемент Элемент Элемент Элемент      Элемент Элемент

                            Рис. 45


       Процессы, которые запрашивают захваты этой  базы  дан-

  ных, должны решить, будут ли они захватывать всю базу  дан-

  ных, файл в базе данных, запись или  единственный  элемент.

  Захват всей базы данных считается захватом на верхнем уров-

  не иерархии. Захват единственного элемента - захват на ниж-

  нем уровне иерархии.



       12.1.2. Имена ресурсов


       Системные  служебные  программы  управления   захватом

  обращаются к каждому ресурсу  по  имени,  составленному  из

  четырех частей:

       1) имя, заданное вызвающей программой;

       2) режим доступа вызывающей программы;

       3) номер группы UIC вызывающей  программы  (если  этот

  ресурс не является общесистемным);





                           - 407 -

                        00152-01 97 06


       4) идентификация процесса, породившего этот захват (не

  обязательна).

       Для двух ресурсов, под которыми подразумевается один и

  тот же ресурс, эти четыре части должны быть идентичны.

       Имя, заданное процессом, представляет ресурс, подлежа-

  щий захвату. Другие процессы, которым  необходимо  получить

  доступ к этому ресурсу, должны обращаться к нему при помощи

  такого же имени. Соответствие имени  и  ресурса  устанавли-

  вается по соглашению между взаимосвязанными процессами.

       Режим доступа определяется режимом доступа  вызывающей

  программы, если в вызове системной служебной программы $ENQ

  не задан менее привилегированный режим (п. 2.1.3.).

       Ресурсы могут быть группового значения или общесистем-

  ными. По  умолчанию  имена  ресурсов  определяются  номером

  группы  UIC  вызывающего  процесса.  Общесистемные  ресурсы

  определяются установкой бита флага в вызове системной  слу-

  жебной программы $ENQ. Для того, чтобы  запросить  общесис-

  темные  захваты  из  пользовательского  или  супервизорного

  режимов,  необходимо  иметь   пользовательскую   привилегию

  SYSLCK. Для захвата общесистемных ресурсов из режима управ-

  ления или режима ядра никакие дополнительные привилегии  не

  требуются.

       Если ставится в очередь запрос  на  захват  и  указана

  идентификация порождающего захвата, то запрашиваемый захват

  становится подзахватом по отношению к указанному  порождаю-

  щему захвату. Однако, порождающий захват должен  быть  пре-

  доставлен, иначе запрос на  захват  не  принимается.  Таким




                           - 408 -

                        00152-01 97 06


  способом процесс может осуществлять захват ресурса  с  раз-

  личной степенью иерархии.



       12.1.3. Выбор режима захвата


       Режим захвата определяет, может или нет данный  ресурс

  быть разделен другими  запросами  захвата.  В  операционной

  системе МОС ВП определены шесть режимов захвата:

  LCK$K_NLMODE -

       нулевой режим. Данный режим не предоставляет доступа к

       ресурсу. Нулевой режим обычно используется как индика-

       тор потребности в ресурсе либо  как  средство  занятия

       места для будущих преобразований захвата;

  LCK$K_CRMODE -

       совместное чтение. Данный режим  предоставляет  доступ

       на чтение ресурса и  допускает  разделение  ресурса  с

       другими читающими процессами. Режим совместного чтения

       обычно используется в тех случаях, когда осуществляет-

       ся дополнительный захват на нижнем уровне  иерархии  с

       подзахватами, или для чтения данных  из  ресурса  "без

       защиты" (допускающего одновременную запись в ресурс);

  LCK$K_CWMODE -

       совместная запись. Данный режим  предоставляет  доступ

       на запись в ресурс и допускает  разделение  ресурса  с

       другими  записывающими  процессами.  Режим  совместной

       записи обычно используется для выполнения дополнитель-

       ного захвата на нижнем уровне иерархии или для  записи

       в ресурс "без защиты";



                           - 409 -

                        00152-01 97 06


  LCK$K_PRMODE -

       защищенное чтение. Данный режим  предоставляет  доступ

       на чтение ресурса и  допускает  разделение  ресурса  с

       другими читающими процессами.  Записывающим  процессам

       запрещается доступ к ресурсу. Это обычный "разделяемый

       захват";

  LCK$K_PWMODE -

       защищенная запись. Данный режим  предоставляет  доступ

       на запись в ресурс и допускает  разделение  ресурса  с

       захватами,  имеющими  режим  совместного  чтения.  Это

       обычный "захват для обновления";

  LCK$K_EXMODE -

       монопольный режим. Данный режим  предоставляет  доступ

       на запись в ресурс и запрещает разделение этого ресур-

       са с любыми другими читающими или  записывающими  про-

       цессами. Это обычный "монопольный захват".



       12.1.4. Уровни захвата и совместимость


       Захваты, которые разрешают процессу разделять  ресурс,

  называются захватами низкого уровня. Захваты, которые  дают

  практически монопольный доступ к ресурсу, называются захва-

  тами высокого уровня. Захваты с нулевым режимом  и  режимом

  совместного чтения считаются захватами низкого уровня. Зах-

  ваты с режимом защищенной записи и  с  монопольным  режимом

  считаются захватами высокого уровня. По возрастанию  уровня

  режимов доступа режимы захвата  располагаются  в  следующем

  порядке: нулевой,  совместное  чтение,  совместная  запись,



                           - 410 -

                        00152-01 97 06


  защищенное чтение, защищенная запись и  монопольный  режим.

  Режим совместной записи и режим защищенного чтения считают-

  ся режимами одного уровня.

       Разделяемые захваты должны  иметь  совместимые  режимы

  захвата. Режимы захвата высших уровней менее  совместимы  с

  другими, чем режимы захвата  низших  уровней.  В  табл.  40

  показана совместимость режимов захвата.


                                                   Таблица 40

                 Совместимость режимов захвата

  -----------------------------------------------------------

  Режим          ! Режим представленных на текущий момент

  запрашиваемого !           времени захватов

  захвата        !-------------------------------------------

                 !  NL  !  CR  !  CW   !  PR  !   PW  !  EX

  -----------------------------------------------------------

       NL        !  Да  !  Да  !  Да   !  Да  !   Да  ! Да

       CR        !  Да  !  Да  !  Да   !  Да  !   Да  ! Нет

       CW        !  Да  !  Да  !  Да   ! Нет  !  Нет  ! Нет

       PR        !  Да  !  Да  !  Нет  !  Да  !  Нет  ! Нет

       PW        !  Да  !  Да  !  Нет  ! Нет  !  Нет  ! Нет

       EX        !  Да  !  Нет !  Нет  ! Нет  !  Нет  ! Нет


       Примечания:

       Обозначение режимов захвата:

       NL - нулевой захват.

       CR - совместное чтение.

       CW - совместная запись.




                           - 411 -

                        00152-01 97 06


       PR - защищенное чтение.

       PW - защищенная запись.

       EX - монопольный режим.



       12.1.5. Очереди управления захватом


       Запрос на захват может быть в одном из трех состояний:

       GRANTED - запрос на захват удовлетворен;

       WAITING - запрос на захват ожидает разрешения;

       CONVERSION - запрос на захват удовлетворен для  одного

  режима и ожидает разрешения для режима захвата более  высо-

  кого уровня.

       Каждому из трех состояний соответсвует  очередь  (рис.

  46).

                  Три очереди захватов

                           +-------------+
                           !             !---->+  Совмести-
           +-------------->!Предоставлен-!     !  мые преоб-
           !  +----------->! ные захваты !<----+  разования
           !  !  +-------->!             !---->+
           !  !  ! Предос- +-------------+     !  Несовмес-
           !  !  ! тавлен- !Преобразования     !  тимые пре-
           !  !  ! ные     +-------------+     !  образова-
           !  !  +---------! Преобразова-!<----+    ния
           !  !            !   ния       !
  Новый    !  !            +-------------+
  захват   !  ! Ожидающие захваты пре-
  предос-  !  ! доставлены +-------------+
  тавляется!  +<-----------!             !
  ---------+  Новый захват ! Ожидающие   !
        ставится в очередь !  захваты    !
  ------------------------>!             !
                           +-------------+

                            Рис. 46


       Когда делается запрос на новый захват, служебные прог-

  раммы управления захватом сначала определяют,  известен  ли



                           - 412 -

                        00152-01 97 06


  данный  ресурс  в   настоящий   момент   (т.е.   имеют   ли

  какие-нибудь другие процессы запрос на захват этого  ресур-

  са). Если ресурс новый (т.е. не существует других  запросов

  на захват данного ресурса), то служебные программы управле-

  ния захватом создают элемент для нового ресурса и запрошен-

  ного захвата. Если ресурс уже известен, то программы захва-

  та определяют, есть ли какие-нибудь другие запросы на  зах-

  ват либо в  очереди  ожидающих  запросов,  либо  в  очереди

  преобразований. Если и та, и другая очереди пусты, то  слу-

  жебные программы управления захватом определяют,  совместим

  ли новый захват с другими предоставленными захватами.  Если

  захват совместим, то он  предоставляется.  Если  запрос  на

  захват несовместим, то он помещается  в  очередь  ожидающих

  запросов. При помощи бита  флага  можно  указать  служебным

  программам управления захватом,  что,  если  запрос  нельзя

  удовлетворить немедленно, то его не  требуется  помещать  в

  очередь.



       12.1.6. Концепции преобразования захвата


       Преобразования захвата  позволяют  процессам  изменить

  уровень захватов. Например, процесс может установить захват

  низкого уровня на ресурс до тех пор,  пока  он  не  захочет

  ограничить доступ к этому ресурсу. Тогда процесс может зап-

  росить преобразование захвата.

       Преобразования захвата задают при  помощи  бита  флага

  (п. 12.3.4) и блока состояния захвата. Блок состояния  зах-

  вата должен содержать идентификацию преобразуемого захвата.



                           - 413 -

                        00152-01 97 06


  если новый режим захвата совместим с текущими предоставлен-

  ными захватами, то преобразованный  запрос  удовлетворяется

  сразу же. Если новый режим захвата несовместим с существую-

  щими захватами в очереди предоставленных захватов, то  дан-

  ный запрос помещается в очередь преобразований. Данный зах-

  ват сохраняет свой старый режим захвата и не получает новый

  режим захвата до тех пор, пока не будет удовлетворен запрос

  на преобразование.

       Когда захват удаляется из очереди или преобразуется  в

  режим захвата более высокого  уровня,  служебные  программы

  управления захватом проверяют первый запрос на преобразова-

  ние в очереди запросов на преобразование.  Если  запрос  на

  преобразование совместим  с  предоставленными  в  настоящий

  момент захватами, то он удовлетворяется.  Также  удовлетво-

  ряются все непосредственно  следующие  за  ним  совместимые

  запросы на преобразование. Если очередь  на  преобразование

  пуста, то проверяется очередь ожидающих запросов. Если пер-

  вый запрос на захват в очереди ожидающих запросов совместим

  с предоставленными на текущий момент захватами, то он удов-

  летворяется. Также удовлетворяются все непосредственно сле-

  дующие за ним совместимые запросы на захват.



       12.1.7. Обнаружение "мертвого захвата"


       "мертвый захват" возникает в том случае, когда сущест-

  вует некоторая группа захватов, ожидающих друг друга.  При-

  мер такой ситуации показан на рис. 47.





                           - 414 -

                        00152-01 97 06


                  "мертвый захват"

    А                              B
  +-------------------+          +-------------------+
  ! Ожидание ресурса, !          ! Ожидание ресурса, !
  ! который принадле- !--------->! который принадле- !
  ! жит В             !          !  жит С            !
  +-------------------+          +-------------------+
         A                                     !
         !        C                            !
         !        +-------------------+        !
         !        ! Ожидание ресурса, !        !
         +--------! который принадле- !<-------+
                  !  жит А            !
                  +-------------------+

                            Рис. 47


       На рис. 47 три процесса поставили в очередь запросы на

  ресурсы, к которым нельзя получить доступ до тех пор,  пока

  из очереди не будут удалены текущие  задерживающие  захваты

  (или пока они не будут преобразованы в режим захвата  более

  низкого уровня).

       Если служебные программы управления  захватом  опреде-

  ляют, что существует "мертвый захват", то для этого захвата

  выбирается (программами) некоторый процесс. Если  выбранный

  процесс запрашивал новый захват, то этот захват не  предос-

  тавляется, если он запрашивал  преобразование  захвата,  то

  данному захвату возвращается его старый  режим  захвата.  В

  любом случае в блок состояния захвата помещается  код  сос-

  тояния SS$_READLOCK.  Предоставленные  захваты  никогда  не

  отменяются. Только ожидающие запросы на захват могут  полу-

  чить код состояния SS$_READLOCK.

       Примечание. Программы пользователя не должны брать  на

  себя решение того, какой процесс будет выбран  для  разрыва

  "мертвого захвата".



                           - 415 -

                        00152-01 97 06


       12.2. Постановка в очередь  простых  запросов

             на захват


       Для постановки в очередь запросов  на  захват  исполь-

  зуется программа системного обслуживания $ENQ. Когда запра-

  шиваются новые захваты, в вызове программы системного  обс-

  луживания должны быть указаны режим  захвата,  адрес  блока

  состояния захвата и имя ресурса. Следующий пример иллюстри-

  рует вызов $ENQ.

       Пример.

   LKSB:    .BLKQ    0            ; место блока состояния

   RESOURCE:                      ; захвата

            .ASCID /STRUCTURE_1/  ; STRUCTURE_1 это имя зах-

              .                   ; ватываемого ресурса

              .

              .

            $ENQW_S LKMODE=#LCK$K_PRMODE, -  ; режим

                                  ; защищенного чтения

                    LKSB=LKSB,-

                    RESNAM=RESOURCE

       В данном примере структура данных STRUCTURE_1 доступна

  нескольким процессам. Некоторые процессы читают эту  струк-

  туру данных, другие пишут  в  нее.  Структура  должна  быть

  защищена от чтения читающими программами на то время,  пока

  она обновляется записывающими программами. В примере читаю-

  щая ппрограмма ставит в очередь запрос на режим защищенного

  чтения. Режим защищенного чтения совместим с  самим  собой,

  поэтому все читающие программы могут читать данную структу-



                           - 416 -

                        00152-01 97 06


  ру одновременно. Программы, записывающие в  эту  структуру,

  используют захваты с режимом защищенной записи или с  моно-

  польным режимом. Поскольку режим защищенной записи и  моно-

  польный режим несовместимы с  режимом  защищенного  чтения,

  никакие записывающие программы не могут писать в  структуру

  данных до тех пор, пока читающие программы не отменят  свои

  захваты и никакие читающие программы не могут читать струк-

  туру данных пока записывающие  программы  не  отменят  свои

  захваты.



       12.3. Синхронизация захватов


       Программа  системного  обслуживания  $ENQ   возвращает

  управление вызывающей программе после постановки в  очередь

  запроса на захват. Код состояния в регистре R0  показывает,

  насколько успешно выполнена постановка запроса  в  очередь.

  После постановки запроса в очередь программа не имеет  дос-

  тупа к данному ресурсу до тех пор,  пока  запрос  не  будет

  удовлетворен. Для того, чтобы узнать, удовлетворен  ли  уже

  запрос, программа может использовать три способа:

       1) задать номер флага события, который должен устанав-

  ливаться, когда запрос будет удовлетворен, и ждать установ-

  ки этого флага события;

       2) указать адрес подпрограммы  обработки  асинхронного

  системного прерывания (AST), которую необходимо  выполнить,

  когда запрос будет удовлетворен;

       3) опрашивать блок состояния захвата о наличии возвра-

  щаемого кода состояния, который указывает на то, что запрос



                           - 417 -

                        00152-01 97 06


  уже удовлетворен.

       Эти методы синхронизации идентичны тем способам  синх-

  ронизации, которые используются программами системного обс-

  луживания $QIO (подраздел 7.3).

       Программа $ENQW осуществляет синхронизацию, комбинируя

  функции программ системного  обслуживания  $ENQ  и  $SYNCH.

  Программа $ENQW имеет те же самые аргументы, что и програм-

  ма $ENQ. Она ставит в очередь запрос  на  захват,  а  затем

  переводит программу  в  состояние  ожидания  флага  события

  (LEF) до тех пор, пока не будет удовлетворен запрос на зах-

  ват.



       12.3.1. Извещение о синхронизации выполнения


       Служебные программы управления  захватом  обеспечивают

  механизм, который позволяет процессам определить, что  зап-

  рос на захват удовлетворен синхронно,  то  есть  запрос  на

  захват не помещался в очередь ожидающих запросов или в оче-

  редь запросов на преобразование.

       Если установлен бит флага LCK$M_SYNCSTS, и захват пре-

  доставлен синхронно, то в регистр R0 возвращается код  сос-

  тояния SS$_SYNCH, не устанавливаются никакие флаги  события

  и не осуществляется доставка AST.

       Если запрос не выполняется синхронно, то  возвращается

  код успешного  завершения  SS$_NORMAL.  Флаги  событий  или

  подпрограммы AST работают как обычно  (т.е.,  когда  захват

  будет предоставлен, устанавливается флаг события и  достав-

  ляется AST).



                           - 418 -

                        00152-01 97 06


       12.3.2. Блок состояния захвата


       Блок состояния захвата получает конечный код  заверше-

  ния и идентификацию захвата, а также (необязательно) содер-

  жит блок значений захвата, показанный  на  рис.  48.  Когда

  запрос на захват ставится в очередь, идентификация  захвата

  запоминается в блоке состояния захвата даже в  том  случае,

  если данный захват еще не предоставлен. Это позволяет прог-

  рамме удалить из очереди те запросы на захват,  которые  не

  могут быть удовлетворены (подраздел 12.4).


            Блок состояния захвата

     +-------------------------------------+
     ! Не используется  !   Код условия    !
     +-------------------------------------+
     !      Идентификация захвата          !
     +-------------------------------------+
     !  16 байтовый блок значений захвата  !
     !  используется только в том случае,  !
     !  если бит LCK$M_VALBLK установлен   !
     +-------------------------------------+

                            Рис. 48


       Код состояния  помещается  в  блок  состояния  захвата

  только в том случае, если захват предоставляется (или  если

  в предоставлении захвата возникли ошибки).

       Использование блока  значений  захвата  описано  в  п.

  12.5.1.



       12.3.3. AST по захвату


       Иногда при использвании  служебных  программ  захвата,

  процессу крайне желательно знать, не мешает ли  он  другому




                           - 419 -

                        00152-01 97 06


  процессу захватить ресурс. Служебные  программы  управления

  захватом информируют процессы об этом при помощи  использо-

  вания AST по захвату. Для того, чтобы AST по  захвату  были

  разрешены, аргумент BLKAST программы системного  обслужива-

  ния $ENQ должен содержать адрес  подпрограммы  обслуживания

  AST по захвату. Если данный  захват  мешает  предоставлению

  другого захвата, то доставляется AST по  захвату  и  выпол-

  няется подпрограмма обслуживания AST по захвату. Для  пере-

  дачи параметра  по  захвату  используется  аргумент  ASTPRM

  (раздел 5).



       12.3.4. Преобразование захвата


       Преобразования захвата выполняют три основных функции:

       1) установление захвата низкого уровня и  преобразова-

  ние его в нужный момент  в  режим  захвата  более  высокого

  уровня;

       2) сохранение значений, записанных  в  блоке  значений

  захвата ресурса;

       3) улучшение производительности в некоторых областях.

       Обычно во время записи данных процедура требует  моно-

  польный режим захвата (или режим защищенной записи).  Одна-

  ко, нежелательно, чтобы процедура на все  время  монопольно

  захватывала ресурс, если неизвестно, потребуется ли во вре-

  мя выполнения запись в ресурс. Установление захвата с моно-

  польным режимом или с режимом защищенной  записи  закрывает

  другим процессам доступ к данному  ресурсу.  Преобразования

  захвата позволяют процессу сначала запросить захват низкого



                           - 420 -

                        00152-01 97 06


  уровня и только, когда потребуется писать данные,  преобра-

  зовать этот захват в режим более высокого уровня (например,

  в режим защищенной записи).

       Некоторые случаи применения захватов требуют использо-

  вания блока значений захвата. Если в блоке значений захвата

  сохраняется номер версии или другие данные,  то,  чтобы  не

  потерять этот блок значений, необходимо сохранить по  край-

  ней мере один захват на данный ресурс. В этом  случае  про-

  цессы преобразуют свои захваты  в  нулевые  захваты  вместо

  того, чтобы удалять их из очереди после того, как  заканчи-

  вается работа с ресурсом.

       Для того, чтобы улучшить производительность в  некото-

  рых случаях на все ресурсы, которые могут  быть  захвачены,

  делаются во время инициализации нулевые  захваты.  По  мере

  необходимости нулевые захваты можно преобразовывать в  зах-

  ваты более высокого уровня. Обычно запрос на преобразование

  обрабатывается быстрее, чем запрос на новый захват,  потому

  что необходимые структуры  данных  уже  построены.  Однако,

  установление любого захвата для процедуры требует системной

  динамической памяти.  Следовательно,  метод  создания  всех

  требуемых захватов как нулевых и преобразование их по  мере

  необходимости улечшает производительность ценой  увеличения

  требований памяти.

       Примечание. Если в запросе на  преобразование  захвата

  задан бит LCK$M_NOQUEUE и преобразование закончилось  ошиб-

  кой, то новые параметр и адрес AST по захвату, указанные  в

  этом запросе на преобразование, замещают параметр  и  адрес




                           - 421 -

                        00152-01 97 06


  AST по захвату, указанные в предыдущем запросе $ENQ.



       12.3.4.1. Постановка  в   очередь   запросов   на

                 преобразование захвата


       Для  того,  чтобы  выполнить  преобразование  захвата,

  программа вызывает программу системного обслуживания  $ENQ,

  устанавливая бит флага LCK$M_CONVERT. Преобразования захва-

  та не используют аргументы RESNAM, PAGID, ACMODE или  PROT.

  Захват, подлежащий преобразованию, определяется той  идети-

  фикацией захвата, которая содержится в блоке состояния зах-

  вата. Преобразоваться могут только те захваты, которые  уже

  предоставлены.

       Пример.


  LKSB:   .BLKQ   0

  RESOURCE:

          .ASCID  /STURCTURE_1/

            .

            .

            .

          .ENQW_S LEMODE=#LCK$K_NLMODE - ; нулевой захват

                  LKSB=LKSB, -

                  RESNAM=RESOURCE

            .

            . <----------------------- захват предоставлен

            .

          $ENQW_S LKMODE=#LCK$K_PWMODE,- ; защищенная запись




                           - 422 -
         
                        00152-01 97 06


                  LKSB=LKSB, -    ; идентификация захвата на-

                                  ; ходится в LKSB

                  FLAGS=#LCK$M_CONVERT   ; преобразовать

            .

            .

            .



       12.3.5. Порождающие захваты


       Когда запрос на захват поставлен в очередь, его  можно

  об'явить порождающим захватом для нового захвата. Если зах-

  ват имеет породивший его захват, он называется подзахватом.

  Для задания порождающего захвата программе системного  обс-

  луживания $ENQ в аргументе  PARID  передается  идентифкация

  порождающего захвата. Порождающий захват должен  предостав-

  ляться раньше, чем принадлежащий ему подзахват.

       Задание порождающих захватов имеет  следующие  преиму-

  щества:

       1) захваты низкого уровня (совместное чтение или  сов-

  местная запись) могут удерживать ресурсы на верхнем  уровне

  иерархии (например, файлы), в то время как подзахваты более

  высокого уровня (защищенная запись или  монопольный  режим)

  удерживают ресурсы более низкого  уровня  иерархии  (такие,

  как записи или элементы данных);

       2) имена ресурсов уникальны для  каждого  порождающего

  захвата (порождающие захваты являются частью  имени  ресур-

  са).





                           - 423 -

                        00152-01 97 06


       Количество уровней подзахватов ограничивается размером

  стека прерываний. Если этот предел превышен, то возвращает-

  ся код состояния ошибки SS$_EXDEPTH. Размером стека  преры-

  ваний  управляет  параметр  системной  генерации   (SYSGEN)

  INTSTKPAGES. Принятое  по  умолчанию  значение  INTSTKPAGES

  допускает 32 уровня подзахватов (см. документ [18]).
                                        


       12.3.6. Блоки значений захватов


       Блок значений захвата - это необязательное 16-байтовое

  расширение блока состояния захвата. Когда  процесс  впервые

  связывает блок значений захвата с конкретным ресурсом, слу-

  жебные программы управления захватом создают блок  значений

  захвата для этого ресурса. Блок значений захвата, принадле-

  жащий ресурсу, поддерживается служебными программами управ-

  ления захвата до тех пор, пока существует хотя бы один зап-

  рос на захват этого ресурса.

       Чтобы связать блок значений захвата с  ресурсом,  тре-

  буется установить бит флага LCK$M_VALBLK в вызове программы

  системного обслуживания $ENQ. Аргумент LKSB (блок состояния

  захвата) должен содержать адрес блока состояния захвата для

  данного ресурса.

       Если процесс устанавливает бит  флага  LCK$M_VALBLK  в

  запросе на захват (или в запросе на преобразование) и  зап-

  рос на захват (или преобразование) удовлетворен, то  содер-

  жимое блока значений захвата, принадлежащего ресурсу, запи-

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





                           - 424 -

                        00152-01 97 06


       Когда процесс устанавливает бит флага  LCK$M_VALBLK  в

  запросе на преобразование монопольного  режима  или  режима

  защищенной записи в режим более низкого уровня,  содержимое

  блока значений захвата,  принадлежащего  процессу,  запоми-

  нается в блоке значений захвата, принадлежащем ресурсу.

       В табл. 41 показано, как влияют преобразования захвата

  на содержимое блоков значений захвата,  принадлежащих  про-

  цессу и ресурсу.


                                                   Таблица 41

    Влияние преобразования захвата на блок значений захват

  -----------------------------------------------------------

  Режим зах-!  Режим, в который преобразуется захват

  вата, в   ! -----------------------------------------------

  котором   !       !       !       !       !       !

  реализован!   NL  !  CR   !  CW   !   PR  !  PW   !  EX

  захват    !       !       !       !       !       !

  -----------------------------------------------------------

      NL    !Возврат!Возврат!Возврат!Возврат!Возврат!Возврат

      CR    !Ничего !Возврат!Возврат!Возврат!Возврат!Возврат

      CW    !Ничего !Ничего !Возврат!Возврат!Возврат!Возврат

      PR    !Ничего !Ничего !Ничего !Возврат!Возврат!Возврат

      PW    !Запись !Запись !Запись !Запись !Запись !Возврат

      EX    !Запись !Запись !Запись !Запись !Запись !Запись











                           - 425 -

                        00152-01 97 06


       Примечания:

       1. Обозначения режимов захвата:

       NL - нулевой захват;

       CR - совместное чтение;

       CW - совместная запись;

       PR - защищенное чтение;

       RW - защищенная запись;

       EX - монопольный захват.

       2. Возврат - содержимое блока значений  захвата,  при-

  надлежащего ресурсу, возвращается в блок значений  захвата,

  принадлежащий процессу.

       3. Ничего - ничего не  записывается  в  блок  значений

  захвата, принадлежащий процессу. Ничего не  возвращается  в

  блок значений захвата, принадлежащий ресурсу.

       4. Запись - содержимое блока значений захвата, принад-

  лежащего процессу, записывается в  блок  значений  захвата,

  принадлежащий ресурсу.

       Когда из очереди при помощи программы системного  обс-

  луживания $DEQ (удалить из очереди запрос на  захват)  уда-

  ляются запросы на захват с режимом защищенного  чтения  или

  монопольным режимом, а в аргументе VALBLK задан адрес блока

  значений захвата, - содержимое этого блока значений захвата

  записывается в блок значений захвата, принадлежащий  ресур-

  су.










                           - 426 -

                        00152-01 97 06


       12.4. Удаление запросов на захват из очереди


       Если процессу больше не нужен какой-то запрос на  зах-

  ват ресурса, то этот запрос на захват можно удалить из оче-

  реди. Для удаления запросов на захват  из  очереди  исполь-

  зуется программа  системного  обслуживания  $DEQ.  Удаление

  запросов на захват из очереди просто обозначает,  что  ука-

  занный запрос на захват будет исключен из очереди, если  он

  там есть. Запросы на захват  удаляются  из  любой  очереди:

  предоставленных захватов, ожидающих захватов  или  запросов

  на преобразование. Когда из очереди удален последний запрос

  на захват какого-то ресурса, служебная программа управления

  захватом исключает имя ресурса из своих структур данных.

       Макрокоманда $DEQ имеет четыре необязательных аргумен-

  та (LKID, VALBLK, ACMODE и FLAGS). Аргумент LKID  позволяет

  процессу задать конкретный  запрос  на  захват,  подлежащий

  удалению из очереди, при помощи иднтификации захвата, возв-

  ращенной в блок состояния захвата.

       Аргумент VALBLK содержит адрес 16-байтового блока зна-

  чений захвата. Если удаляемый запрос на захват имеет  режим

  защищенного чтения или  монопольный  режим,  то  содержимое

  блока значений запоминается в блоке значений,  связанном  с

  ресурсом. Если удаляемый  запрос  на  захват  имеет  другой

  режим, то блок значений захвата не используется. Блок  зна-

  чений захвата можно использовать только в том случае,  если

  из очереди удаляется отдельный запрос на захват.







                           - 427 -

                        00152-01 97 06


       Существует три допустимых флага:

       1) LCK$M_DEQALL;

       2) LCK$M_CANCEL;

       3) LCK$M_INVVALBLK.

       Флаг LCK$M_DEQALL указывает  на  то,  что  из  очереди

  необходимо удалить все запросы  на  захват,  имеющие  режим

  доступа, определенный в аргументе ACMODE, и менее  привиле-

  гированные режимы. Режим доступа повышается до режима  дос-

  тупа вызывающей программы. Если задан флаг LCK$M_DEQALL, то

  аргумент LKID должен быть нулевым (или его можно не  указы-

  вать).

       Если задан фдлаг LCK$M_CANCEL, то служебная  программа

  $DEQ пытается отменить запрос  на  преобразование  захвата,

  который был поставлен в очередь программой $ENQ. Эта попыт-

  ка может быть успешной только в том случае, если запрос  на

  захват еще не был удовлетворен, то есть, этот запрос  нахо-

  дится в очереди запросов на  преобразование  захвата.  Если

  указан флаг LCK$M_DEQALL, то флаг LCK$M_CANCEL  игнорирует-

  ся.

       Если задан флаг  LCK$M_INVVALBLK,  то  программа  $DEQ

  помечает, как ошибочный, блок значений захвата, принадлежа-

  щий ресурсу в базе данных захвата.

       Пример.

  LKSB:   .QUAD   0

  RESOURCE:
                                                      
          .ASCID  /STRUCTURE_1/   ; ресурс STRUCTURE_1

            .




                           - 428 -

                        00152-01 97 06


            .

            .

  $ENQ_S  LKMODE=#LCK$K_CRMODE, - ; режим совместного чтения

          LKSB=LKSB

          RESNAM=RESOURCE, -

          ASTADR=READ_UPDATES

             .

             .

             .

  $DEQ_S  LKID=LSKB+4             ; LKSB+4 содержит идентифи-

                                  ; кацию захвата

       Захваты с пользовательским режимом автоматически  уда-

  ляются из очереди при завершении работы образа.



       12.5. Кэширование   локального   буфера   при

             помощи программ управления захватом


       Под кэшированием следут понимать тот или дургой  метод

  (пп. 12.5.1 и 12.5.2) сокращения накладных  расходов,  свя-

  занных с временем доступа к ресурсам, разделяемым  несколь-

  кими процессами.

       Служебные программы управления  захватом  обеспечивают

  прикладным программам средства для  выполнения  кэширования

  (быстрого доступа) локального буфера (так называемое управ-

  ление распределенным буфером). Кэширование локального буфе-

  ра позволяет нескольким процессам  сохранять  копии  данных

  (например, дисковых блоков) в буферах, локальных для каждо-

  го процесса, и обеспечивает  средства  информирования  этих



                           - 429 -

                        00152-01 97 06


  процессов в нужный момент о том, что буферы содержат  иска-

  женные данные вследствие модифификации их другим процессом.

  Если модификации редки, можно сэкономить значительное коли-

  чество операций ввода-вывода при помощи поддержания локаль-

  ных копий буферов (  в  результате  названного  кэширования

  локальных буферов, или управления распеределенным буфером).

  Для осуществления кэширования  буферов  можно  использовать

  либо блок значений захвата, либо AST по захвату (или  то  и

  другое вместе).



       12.5.1. Использование блока значений захвата


       Для выполнения кэширования локального буфера при помо-

  щи блока значений захвата каждый процесс, организующий  КЭШ

  буферов, устанавливает захват с нулевым режимом на  ресурс,

  который  представляет  текущее  содержимое  каждого  буфера

  (например, буферы содержат дисковые блоки). Блок  значений,

  связанный с  каждым  ресурсом,  используется  для  хранения

  номера версии дисковых блоков. Когда впервые делается  зап-

  рос на захват конкретного дискового  блока,  текущий  номер

  версии этого дискового блока возвращается в  блок  значений

  захвата, принадлежащий процессу.  Если  содержимое  буферов

  кэшируется, то вместе с буфером  сохраняется  номер  данной

  версии. Для того, чтобы снова использовать содержимое буфе-

  ра, необходимо преобразовать нулевой захват в  режим  защи-

  щенного чтения или в монопольный режим,  в  зависимости  от

  того, предназначен этот буфер для чтения  или  для  записи.

  Такое преобразование возвращает самый последний номер  вер-



                           - 430 -

                        00152-01 97 06


  сии дискового блока.  Этот  номер  версии  дискового  блока

  сравнивается с сохраняемым номером версии. Если они  равны,

  то кэшируемая копия допустима. Если они не равны, то с дис-

  ка должна считываться последняя копия дискового блока.

       Всякий раз, когда процедура  модифицирует  буфер,  она

  записывает модифицированный буфер на диск и затем  увеличи-

  вает на 1 номер версии перед тем, как  преобразовать  соот-

  ветствующий захват в нулевой режим. Таким образом,  следую-

  щий процесс, который пытается использовать  свою  локальную

  копию из этого же буфера,  обнаружит  несовпадение  номеров

  версии и должен считать самую последнюю копию с диска вмес-

  то  того,  чтобы  использовать  свой  кэшированный  (теперь

  некорректный) буфер.



       12.5.2. Использование AST по захвату


       AST по захвату используются для информирования процес-

  сов, имеющих предоставленные захваты,  о  том,  что  другой

  процесс с несовместимым режимом захвата поставлен в очередь

  на доступ у тому же ресурсу.

       AST по захвату можно использовать для поддержки  кэши-

  рования локальных буферов двумя способами. Один путь  вклю-

  чает отложенную запись буфера, другой является альтернатив-

  ным методом кэширования локальных буферов без использования

  блоков значений.









                           - 431 -

                        00152-01 97 06


       12.5.2.1. Отложенная запись буфера


       Когда выполняется кэширование локальных буферов, моди-

  фицированный буфер должен записываться на диск раньше,  чем

  можно будет освободить захват с монопольным  режимом.  Если

  ожидается  большое  количество  модификаций  (особенно   за

  короткий период времени), то можно снизить количество  опе-

  раций ввода-вывода на диск, устанавливая захват с монополь-

  ным режимом на все время, пока будут осуществляться модифи-

  кации, и записывая на диск один  раз.  Однако,  это  мешает

  другим процессам использовать те же блоки диска  в  течение

  данного интервала. Такую  ситуацию  можно  исключить,  если

  процесс, осущетсвляющий захват с монопольным режимом, имеет

  AST по захвату. Данный процесс будет  извещен  (при  помощи

  AST), если другому процессу понадобится использовать тот же

  самый дисковый блок. Тогда владелец захвата  с  монопольным

  режимом может записать буфер на диск и  преобразовать  свой

  захват в нулевой режим (открывая таким образом другому про-

  цессу доступ к данному дисковому блоку). Однако, в том слу-

  чае, если один и тот же дисковый блок не  требуется  разным

  процессам, то процесс может его многократно модифицировать,

  а записывать на диск только один раз.



       12.5.2.2. Кэширование буфера


       Для выполнения кэширования при помощи AST  по  захвату

  процессы после того, как они заканчивают работу с  буфером,

  не преобразуют свои захваты из  режима  защищенного  чтения




                           - 432 -

                        00152-01 97 06


  или из монопольного режима в нулевой  режим.  Вместо  этого

  они получают AST по захвату всякий раз, когда  другой  про-

  цесс пытается завхватить тот же ресурс в несовметимом режи-

  ме. При данном способе процессы извещаются о  том,  что  их

  кэшированные буферы некорректны, не  в  тот  момент,  когда

  процесс пытается снова использовать  буфер,  а  как  только

  возникает необходимость модифицировать буфер.



       12.5.3. Выбор способа кэширования буферов


       Выбор способа кэширования локальных буферов (при помо-

  щи блока значений захвата или AST по  захвату)  зависит  от

  требований программы пользователя. Те программы пользовате-

  ля, которые используют  блок  значений  захвата,  выполняют

  больше преобразований захвта, тогда как те, которые исполь-

  зуют AST по захвату, доставляют  больше  ASТ.  Оба  способа

  совместимы друг с другом. Одновременно  некоторые  процессы

  могут использовать один способ, а дургие процессы - другой.

  Использвание AST по захвату предпочтительнее в  слабоконку-

  рентной среде, тогда как использование блока значений  зах-

  вата предпочтительнее  в  высококонкурентной  среде.  Можно

  разрабатывать "смешанные" или "адаптивные" стратегии.

       В "смешанной" стратегии прикладные  программы  исполь-

  зуют специальные способы. Если содержимое буфера будет пов-

  торно использоваться в течение которткого интервала  време-

  ни, то применяются AST по захвату, если нет причины ожидать

  скорого повторного использования  буфера,  то  используется

  блок значений захвата.



                           - 433 -

                        00152-01 97 06


       В "адаптивной" стратегии прикладная  программа  делает

  оценку частоты появления AST по захвату  и  преобразований.

  Если часто возникают AST по захвату, то  программа  адапти-

  руется к использованию блока значений захвата, если имеется

  много преобразований и одна  и  та  же  кэшированная  копия

  остается допустимой, то программа адаптируется к  использо-

  ванию AST по захвату.

       Например, один процесс постоянно показывает  состояние

  базы данных, тогда как другой от случая к случаю  обновляет

  ее. Если используется блок значений захвата, то  показываю-

  щий процесс должен всегда проверять  действительна  ли  его

  копия базы данных  (при  помощи  выполнения  преобразования

  захвата), тогда как, если используются AST по  захвату,  то

  показывающий процесс извещается о  каждом  обновлении  базы

  данных. С другой стороны, если обновление происходит часто,

  то использование блока  значений  захвата  предпочтительнее

  постоянной доставки AST по захвату.

       Пример.

    ; определить режимы захвата

    INCLUDE '($LCKDEF)'

    ; определить блок состояния

    ; захвата

    INTEGER*2 LOCK_STATUS,

    2          NULL

    INTEGER LOCK_ID

    COMMON /LOCK_BLOCK/ LOCK_STATUS,

                        NULL,




                           - 434 -

                        00152-01 97 06


                        LOCK_ID

                  .

                  .

                  .

    ; запросить нулевой зах-

    ; ват

    STATUS=SYS$ENQW (,

    2                  %VAL(LCK$K_NLMODE),

    2                  LOCK_STATUS,

    2                  ,

    2                  'TERMINAL'.

    2                  ....)

    IF (.NOT.STATUS) CALL LIB$SIGNAL (%VAL(STATUS))

    IF (.NOT.LOCK_STATUS) CALL LIB$SIGNAL (%VAL(LOCK_STATUS))

    ; преобразовать захват в

    ; монопольный

    STATUS=SYS$ENQW (,

    2                 %VAL(LCK$K_EXMODE),

    2                 LOCK_STATUS,

    2                 %VAL (LCK$M_CONVERT),

    2                 'TERMINAL'.

    2                 .....)

    IF (.NOT.STATUS) CALL LIB$SIGNAL (%VAL(STATUS))

    IF (.NOT.LOCK_STATUS) CALL LIB$SIGNAL (%VAL(LOCK_STATUS))

       Приведенный пример программы запрашивает нулевой  зах-

  ват для ресурса с  именем  TERMINAL.  После  предоставления

  захвата программа выдает  запрос  на  преобразование  этого




                           - 435 -

                        00152-01 97 06


  захвата в монопольный захват. После возврата  из  программы

  SYS$ENQW программа проверяет как код состояния,  возвращае-

  мый этой программой системного  обслуживания,  так  и  блок

  состояния захвата, чтобы убедиться, что  запрос  на  захват

  выполнен успешно.

       Для того, чтобы обеспечить разделение терминала  между

  порождающим процессом и подпроцессом, каждый процесс запра-

  шивает нулевой захват на имя разделяемого  ресурса.  Затем,

  каждый раз, когда один из процессов хочет выполнить  опера-

  цию ввода-вывода на терминал,  он  запрашивает  монопольный

  захват, выполняет операцию ввода-вывода и запрашивает нуле-

  вой захват.

       Поскольку планировщик захватов действует только  между

  взаимосвязанными процессами, то процесс, создавший  подпро-

  цесс, не должен завершаться до того, как завершится подпро-

  цесс. Для гарантии того, что порождающий процесс не  завер-

  шается раньше, чем подпроцесс, следует задавать флаг  собы-

  тия, который должен устанавливаться на  выходе  подпроцесса

  (аргумент NUM в LIB$SPAWN). Прежде чем  организовать  выход

  порождающего процесса,  необходимо  использовать  программу

  SYS$WAITFR для гарантии того, что  этот  флаг  события  уже

  установлен.

       После того, как порождающий процесс организует  выход,

  созданный процесс уже не может  синхронизировать  доступ  к

  терминалу, он вынужден будет использовать программу систем-

  ного обслуживания $BRKTHRU для записи на терминал.






                           - 436 -

                        00152-01 97 06


        13. Описание программ системного обслуживания



       В данном разделе описываются все программы  системного

  обслуживания.  Каждая  программа  системного   обслуживания

  документируется по специальному шаблону (см. раздел 1).



       13.1. $ADD_HOLDER - добавить запись держателя

             прав в базу данных прав


       Служебная программа $ADD_HOLDER добавляет запись  ука-

  занного держателя к нужному идентификатору.

       Формат:

       SYS$ADD_HOLDER ID,HOLDER,[ATTRIB]


       Аргументы:

        ID (идентификатор)

        Использование в МОС ВП: RIGHTS_ID

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Идентификатор, который назначается указанному держате-

  лю, когда  программа  $ADD_HOLDER  заканчивает  выполнение.

  Аргумент ID является длинным  словом,  содержащим  двоичное

  значение заданного идентификатора.

        HOLDER (держатель)

        Использование в МОС ВП: RIGHTS_HOLDER

        Тип:                    квадрослово (без знака)

        Доступ:                 только чтение




                           - 437 -

                        00152-01 97 06


        Механизм:               по ссылке

       Идентификатор держателя, которому назначается доступ к

  заданному идентификатору после завершения выполнения  прог-

  раммы $ADD_HOLDER. Аргумент HOLDER является адресом  струк-

  туры данных размером  в  квадрослово,  которое  состоит  из

  длинного слова, содержащего идентификатор UIC держателя,  и

  длинного слова, содержащего нулевое значение.

        ATTRIB (атрибуты)

        Использование в МОС ВП: MASK_LONGWORD

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Атрибуты, которые должны быть помещены в запись держа-

  теля, когда  программа  $ADD_HOLDER  завершает  выполнение.

  Аргумент ATTRIB это длинное слово, содержащее битовую  мас-

  ку, которая задает атрибуты. Указанный атрибут  назначается

  держателю, только если заданный  идентификатор  имеет  этот

  атрибут.

       Символические значения  являются  смещениями  в  битах

  внутри этого длинного слова.  Если  вместо  префикса  KGB$V

  (префикс - это символ или несколько символов, которые пред-

  шествуют символическому имени), использовать префикс KGB$M,

  то эти значения можно получить в виде масок с соответствую-

  щим установленным битом. Символические имена  определены  в

  системной макробиблиотеке ($KGBDEF).

  Бит KGB$V_RESOURSE - позволяет держателю затребовать для

                       идентификатора ресурсы типа блоков




                           - 438 -

                        00152-01 97 06


                       диска.


       Описание

       Программа $ADD_HOLDER регистрирует указанного  пользо-

  вателя в качестве держателя заданного идентификатора в базе

  данных прав.

       Для использования данной программы требуется доступ  с

  записью. Если база данных прав находится в SYS$SYSTEM,  что

  принимается  по  умолчанию,  то  для  получения  доступа  с

  записью в базу данных прав требуется привилегия SYSPRV.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_ACCVIO          - вызывающая  программа  не  может

                           прочитать аргумент HOLDER;

       SS$_BADPARAM        - указанные   атрибуты    содержат

                           неверные флаги атрибутов;

       SS$_DUPIDENT        - указанный держатель этого  иден-

                           тификатора уже имеется в базе дан-

                           ных прав;

       SS$_INSFMEM         - для открытия  базы  данных  прав

                           нет достаточной доступной  динами-

                           ческой памяти процесса;

       SS$_IVIDENT         - неверный формат указанного иден-

                           тификатора или держателя, или ука-

                           занные идентификатор  и  держатель

                           одинаковы;

       SS$_NOSUCHID        - указанный идентификатор отсутст-




                           - 439 -

                        00152-01 97 06


                           вует в базе данных прав, или  ука-

                           занный   идентификатор   держателя

                           отсутствует в базе данных прав;

       RMS$_PRV            - пользователь не имеет доступа  с

                           записью в базу данных прав.

       Поскольку база данных прав является индексным  файлом,

  доступ к которому осуществляется с помощью системы управле-

  ния данными СУД-32, то  данная  служебная  программа  может

  также возвращать коды состояния СУД-32 при работе с индекс-

  ными файлами (см. документ [1]).



       13.2. $ADD_IDENT - добавить  идентификатор  в

             базу данных прав


       Служебная программа $ADD_IDENT добавляет идентификатор

  в базу данных прав.

       Формат:

       SYS$ADD_IDENT NAME,[ID],[ATTRIB],[RESID]


       Аргументы:

        NAME (имя)

        Использование в МОС ВП: CHAR-STRING

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескрип-

                                тор строки фиксированной

                                длины

       Имя идентификатора, которое добавляется в базу  данных




                           - 440 -

                        00152-01 97 06


  прав  после  завершения  выполнения  программы  $ADD_IDENT.

  Аргумент NAME является адресом дескриптора, указывающего на

  строку имени идентификатора.

       Имя   идентификатора   содержит    от    1    до    31

  алфавитно-цифровых символа, включая знаки денежной  единицы

  ($) и подчеркивания (_), и по крайней мере один  нецифровой

  символ.

        ID (идентификатор)

        Использование в МОС ВП: RIGHTS_ID

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Идентификатор, создаваемый в базе  данных  прав  после

  завершения выполнения  программы  $ADD_IDENT.  Аргумент  ID

  является длинным словом, содержащим двоичное значение  соз-

  даваемого идентификатора.

       Если данный аргумент опущен, то  программа  $ADD_IDENT

  выбирает  уникальное  доступное  значение  из  пространства

  общих идентификаторов и возвращает его в  аргументе  RESID,

  если он задан.

        ATTRIB (атрибут)

        Использование в МОС ВП: MASK_LONGWORD

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Атрибуты, которые помещаются в  запись  идентификатора

  после завершения выполнения программы $ADD_IDENT.  Аргумент






                           - 441 -

                        00152-01 97 06


  ATTRIB является длинным словом, содержащим  битовую  маску,

  которая определяет атрибуты.

       Символические значения  являются  смещениями  в  битах

  внутри этого длинного слова.  Если  вместо  префикса  KGB$V

  использовать префикс KGB$M, то эти значения можно  получить

  в виде масок с соответствующим установленным битом.  Симво-

  лические  имена  определены  в  системной   макробиблиотеке

  ($KGBDEF).

  Бит KGB$V_RESOURCE - позволяет держателю затребовать для

                       идентификатора ресурсы типа блоков

                       диска.

        RESID

        Использование в МОС ВП: RIGHTS_ID

        Тип:                    длинное слово (без знака)

        Доступ:                 только запись

        Механизм:               по ссылке

       Значение идентификатора,  который  назанчается  опера-

  ционной  системой  МОС  ВП   после   завершения   программы

  $ADD_IDENT. Аргумент RESID является адресом длинного слова,

  в котором  программа  возвращает  значение  идентификатора,

  назначенного операционной системой МОС ВП.


       Описание.

       Программа $ADD_IDENT добавляет указанный идентификатор

  в базу данных прав.

       Для использования данной программы требуется доступ  с

  записью в базу данных прав. Если база данных прав находится

  в SYS$SYSTEM, что принимается по умолчанию, то для  получе-



                           - 442 -

                        00152-01 97 06


  ния доступа с записью в базу данных прав требуется привиле-

  гия SYSPRV.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_ACCVIO          - вызывающая  программа  не  может

                           прочитать аргумент  NAME,  или  не

                           может записать аргумент RESID;

       SS$_BADPARAM        - указанные   атрибуты    содержат

                           неверные флаги атрибутов;

       SS$_DUPIDENT        - указанный   идентификатор    уже

                           имеется в базе данных прав;

       SS$_DUPLNAM         - указанное имя идентификатора уже

                           имеется в базе данных прав;

       SS$_INSFMEM         - для открытия  базы  данных  прав

                           нет достаточной доступной  динами-

                           ческой памяти процесса;

       SS$_IVIDENT         - неверный формат указанного иден-

                           тификатора;

       PMS$_PRV            - пользователь не имеет доступа  с

                           записью в базу данных прав.

       Поскольку база данных прав является индексным  файлом,

  доступ к которому осуществляется с помощью системы управле-

  ния данными СУД-32, то  данная  служебная  программа  может

  также возвращать коды состояния СУД-32 при работе с индекс-

  ными файлами (см. документ [1]).







                           - 443 -

                        00152-01 97 06


       13.3. $ADJSTK  -  выравнять  указатель  стека

             внешнего режима


       Служебная  программа  $ADJSTK  модифицирует  указатель

  стека для менее привилегированного режима  доступа.  Данная

  служебная программа используется операционной системой  мос

  вп с целью модификации указателя стека для менее привилеги-

  рованного режима доступа после размещения аргументов в сте-

  ке.

       Формат:

       SYS$ADJSTK [ACMODE],[ADJUST],NEWADR


       Аргументы:

        ACMODE (режим доступа)

        Использование в МОС ВП: ACCESS_MODE

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Режим доступа, для  которого  выравнивается  указатель

  стека. Аргумент ACMODE является  значением  режима  доступа

  размером в длинное слово. Если данный аргумент не задан, то

  используется значение по умолчанию 0 (режим доступа ядра).

        ADJUST (выравнивание)

        Использование в МОС ВП: WORD_SIGNED

        Тип:                    слово (со знаком)

        Доступ:                 только чтение

        Механизм:               по значению

       Величина  выравнивания  со  знаком,   которая   должна




                           - 444 -

                        00152-01 97 06


  использоваться для модификации значения,  указанного  аргу-

  ментом NEWADR. Аргумент ADJUST - это длинное слово со  зна-

  ком, содержащее величину выравнивания.

       Используется только младшее слово  данного  аргумента.

  Величина, указанная в младшем слове, добавляется или  вычи-

  тается (в зависимости от знака) из величины, заданной аргу-

  ментом NEWADR. Результат загружается в указатель стека  для

  указанного режима доступа.

       Если аргумент ADJUST не задан или задан равным 0, то в

  указатель стека загружается значение, указанное  аргументом

  NEWADR.

        NEWADR

        Использование в МОС ВП: ADDRESS

        Тип:                    длинное слово (без знака)

        Доступ:                 модификация

        Механизм:               по ссылке

       Значение, которое выравнивает программа $ADJSTK. Аргу-

  мент NEWADR является  адресом  этого  значения  размером  в

  длинное слово. Значение, заданное этим аргументом, читается

  и пишется программой $ADJSTK. Программа $ADJSTK читает ука-

  занное значение  и  выравнивает  его  с  помощью  аргумента

  ADJUST  (если  он  задан).  После  выравнивания   программа

  $ADJSTK пишет полученное значение обратно в длинное  слово,

  указанное аргументом NEWADR, а затем загружает его в указа-

  тель стека.

       Если аргумент NEWADR задает  значение  0,  то  текущее

  значение указателя стека выравнивается значением,  заданным




                           - 445 -

                        00152-01 97 06


  аргументом ADJUST. Это новое значение затем записывается  в

  аргумент NEWADR, а указатель модифицируется.


       Описание.

       Комбинации нулевых  и  ненулевых  значений  аргументов

  ADJUST и NEWADR дают следующие  результаты,  приведенные  в

  табл. 42.


                                                  Таблица 42

  ----------------------------------------------------------

   Значение   ! Значение  !  Результирующее значение

   аргумента  ! аргумента !     указателя стека

   ADJUST     ! NEWADR    !

  ----------------------------------------------------------

        0     !     0     ! Не изменяется

        0     !   Адрес   ! Загружается указанным адресом

  Ненулевое   !     0     ! Выравнивается с помощью указан-

  значение    !           ! ного значения

  Ненулевое   !   Адрес   ! Загружается указанным адресом,

  значение    !           ! выравненным указанным значением


       Во всех случаях обновленное значение  указателя  стека

  записывается в величину, указанную аргументом NEWADR.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_ACCVIO          - вызывающая  программа  не  может

                           записать значение, указанное аргу-

                           ментом NEWADR  или  порцию  нового




                           - 446 -

                        00152-01 97 06


                           сегмента стека;

       SS$_NOPRIV          - указанный  режим  доступа  равен

                           или  более  привилегированный  чем

                           режим доступа вызывающей  програм-

                           мы.



       13.4. $ADJWSL  -  изменить   лимит   рабочего

             набора


       Служебная программа $ADJWSL  изменяет  лимит  рабочего

  набора текущего процесса на заданное число страниц и  возв-

  ращает вызывающей программе новое значение. Лимит  рабочего

  набора указывает максимальное число страниц процесса, кото-

  рые могут быть резидентными в физической памяти.

       Формат:

        SYS$ADJWSL    [PAGCNT],[WSETLM]


       Аргументы:

        PAGCNT (число страниц)

        Использование в МОС ВП: LONGWORD_SIGNED

        Тип:                    длинное слово (со знаком)

        Доступ:                 только чтение

        Механизм:               по значению

       Значение приращения со знаком, задающее число страниц,

  которое требуется прибавить (если это значение  положитель-

  но) или вычесть (если оно отрицательно) из текущего  лимита

  рабочего набора. Аргумент PAGCNT является длинным словом со

  знаком.




                           - 447 -

                        00152-01 97 06


       Если аргумент PAGCNT не задан или задано  значение  0,

  то не делается никакого изменения и текущий лимит  рабочего

  набора возвращается в длинном слове,  указанном  аргументом

  WSETLM (если он задан).

        WSETLM (лимит рабочего набора)

        Использование в МОС ВП: LONGWORD_UNSIGNED

        Тип:                    длинное слово (без знака)

        Доступ:                 только запись

        Механизм:               по ссылке

       Значение лимита рабочего набора, возвращаемое програм-

  мой $ADJWSL. Аргумент WSETLM является адресом данного  зна-

  чения размером в  длинное  слово.  Аргумент  WSETLM  задает

  новое измененное значение, если указан аргумент  PAGCNT,  и

  задает старое неизмененное значение, если  аргумент  PAGCNT

  не указан.


       Описание.

       Если программа пытается изменить лимит рабочего набора

  так, что он будет превышать  верхнюю  или  нижнюю  границу,

  заданные операционной системой МОС  ВП,  то  ошибочный  код

  состояния не  возвращается.  Вместо  этого  лимит  рабочего

  набора устанавливается равным максимальному или минимально-

  му допустимому значению.

       Начальное значение  лимита  рабочего  набора  процесса

  определяется квотой лимита рабочего набора, принимаемого по

  умолчанию (WSDEFAULT). Максимальное значение,  до  которого

  лимит может быть увеличен, контролируется квотой расширения

  рабочего набора  (WSEXTENT),  а  минимальное  значение,  до



                           - 448 -

                        00152-01 97 06


  которого он может быть уменьшен, контролируется  параметром

  MINWSCNT, задаваемым при генерации операционной системы МОС

  ВП.


       Возвращаемые значения кодов состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_ACCVIO          - вызывающая  программа  не  может

                           записать длинное слово,  указанное

                           аргументом WSETLM.



       13.5. $ALLOC - распределить устройство


       Служебная программа $ALLOC распределяет устройство для

  монопольного использования процессом и  его  подпроцессами.

  Никакой другой процесс не может распределить это устройство

  или назначить к нему  канал,  пока  образ,  который  вызвал

  программу $ALLOC, не завершится или явно не  освободит  это

  устройство с помощью служебной программы  $DALLOC  (освобо-

  дить устройство).

       Формат:

       SYS$ALLOC DEVNAM,[PHYLEN],[PHYBUF],[ACMODE],[FLAGS]


       Аргументы:

        DEVNAM (имя устройства)

        Использование в МОС ВП: DEVICE_NAME

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескриптор

                                строки фискированной длины



                           - 449 -

                        00152-01 97 06


       Имя  распределяемого   устройства.   Аргумент   DEVNAM

  является адресом дескриптора строки символов,  указывающего

  на строку имени устройства.

       Строка может быть либо именем  физического  устройства

  или логическим именем. Если это логическое имя, его необхо-

  димо транслировать в имя физического устройства.

        PHYLEN

        Использование в МОС ВП: WORD_UNSIGNED

        Тип:                    слово (без знака)

        Доступ:                 только запись

        Механизм:               по ссылке

       Слово, в которое  программа  $ALLOC  записывает  длину

  строки имени  устройства  для  распределяемого  устройства.

  Аргумент PHYLEN является адресом данного слова.

        PHYBUF

        Использование в МОС ВП: DEVICE_NAME

        Тип:                    текстовая строка

        Доступ:                 только запись

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Буфер, в который программа  $ALLOC  записывает  строку

  имени распределенного устройства. Аргумент PHYBUF  является

  адресом дескриптора строки симвлов, указывающего на  данный

  буфер.

        ACMODE (режим доступа)

        Использование в МОС ВП: ACCESS_MODE

        Тип:                    длинное слово (без знака)




                           - 450 -

                        00152-01 97 06


        Доступ:                 только чтение

        Механизм:               по значению

       Режим доступа, связанный с распределяемым устройством.

  Аргумент ACMODE является длинным  словом,  содержащим  этот

  режим доступа.

       Наиболее привилегированным используемым режимом досту-

  па является режим доступа вызывающей программы. Только рав-

  ный или более привилегированный режим доступа может освобо-

  дить устройство.

        FLAGS (флаги)

        Использование в МОС ВП: MASK_LONGWORD

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Длинное слово флагов состояния, индицирующих,  необхо-

  димо ли интерпретировать аргумент DEVNAM как тип  распреде-

  ляемого устройства. Существует только  один  флаг,  бит  0.

  Если он установлен, то служебная программа $ALLOC распреде-

  ляет первое допустимое устройство, имеющее  тип,  указанный

  аргументом DEVNAM.

       Данное средство доступно для дисковых и ленточных уст-

  ройтсв.


       Описание.

       Вызывающий процесс должен иметь  привилегию  ALLSPOOL,

  чтобы распределить устройство имеющее средство спулинга.

       Когда процесс вызывает служебную программу $ASSIGN для

  назначения канала к неразделяемому устройству  без  средств



                           - 451 -

                        00152-01 97 06


  спулинга, такому как терминал или построчно-печатающее уст-

  ройство, это устройство неявно распределяется процессу.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_BUFFEROVF       - служебная   программа    успешно

                           завершилась. Возвращенное физичес-

                           кое имя переполнило  предоставлен-

                           ный буфер и поэтому было усечено;

       SS$_DEVALRALLOC     - служебная   программа    успешно

                           завершилась. Устройство  уже  было

                           распределено вызывающему процессу;

       SS$_ACCVIO          - вызывающая  программа  не  может

                           прочитать строку имени устройства,

                           дескриптор строки  или  дескриптор

                           буфера  физического   имени,   или

                           вызывающая  программа   не   может

                           записать в буфер физического  име-

                           ни;

       SS$_DEVALLOC        - предупреждение.  Устройство  уже

                           распределено другому процессу, или

                           неудачная   попытка   распределить

                           размонтированное разделяемое  уст-

                           ройство, поскольку другие процессы

                           имеют  назначенные  к  этому  уст-

                           ройству каналы;

       SS$_DEVMOUNT        - заданное устройство в  настоящее

                           время смонтировано и не может быть



                           - 452 -

                        00152-01 97 06


                           распределено,    или    устройство

                           является почтовым ящиком;

       SS$_DEVOFFLINE      - указанное устройство находится в

                           автономном состоянии;

       SS$_IVDEVNAM        - не  указана  строка  имени  уст-

                           ройства или строка имени устройст-

                           ва содержит неверные символы;

       SS$_IVLOGNAM        - строка  имени  устройства  имеет

                           длину 0 или содержит более 63 сим-

                           волов;

       SS$_IVSTSFLG        - в длинном слове флагов состояния

                           установлены неверные биты;

       SS$_NODEVAVL        - при обобщенном поиске  указанное

                           устройство существует, но  распре-

                           делено другому пользователю;

       SS$_NONLOCAL        - предупреждение. Устройство нахо-

                           дится в удаленном узле;

       SS$_NOPRIV          - сделана   попытка   распределить

                           устройство со средством  спулинга,

                           а запрашивающий процесс  не  имеет

                           нужной привилегии, или доступ зап-

                           рещен по защите  устройства  и/или

                           по списку управления доступом;

       SS$_NOSUCHDEV       - предупреждение.  Указанное  уст-

                           ройство отсутствует в операционной

                           системе МОС ВП;

       SS$_TEMPLATEDEV     - сделана   попытка   распределить




                           - 453 -

                        00152-01 97 06


                           шаблонное устройство.  Такое  уст-

                           ройство нельзя распределять.

       Программа  $ALLOC   может   также   возвращать   любое

  значеHдHH, которое возвращает программа $ENQ.



       13.6. $ASCEFC -  подсоединить  кластер  общих

             флагов событий


       Служебная программа $ASCEFC подсоединяет кластер общих

  флагов событий к процессу для выполнения текущего образа  и

  назначает данному кластеру номер для использования  другими

  программами обслуживания  флагов  событий.  Если  названный

  кластер не существует,  но  процесс  имеет  соответствующую

  привилегию, то служебная программа создает этот кластер.

       Формат:

       SYS$ASCEFC EFN,NAME,[PROT],[PERM]


       Аргументы:

        EFN (номер флага события)

        Использование в МОС ВП: EF_NUMBER

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Номер любого флага события, который содержится  внутри

  нужного кластера общих флагов событий.  Аргумент  EFN  есть

  длинное слово, содержащее  значение,  которое  задает  этот

  номер.

       Имеется два кластера общих флагов событий.  Кластер  2




                           - 454 -

                        00152-01 97 06


  содержит номера флагов событий с 64  по  95,  а  кластер  3

  содержит номера флагов событий с 96 по 127. (кластеры 0 и 1

  являются кластерами локальных флагов событий процесса).

       Чтобы связаться с кластером 2  общих  флагов  событий,

  необходимо указать номер любого флага в этом  кластере  (от

  64 до 95). Чтобы связаться с кластером 3 общих флагов собы-

  тий, необходимо указать номер любого флага в этом  кластере

  (от 96 до 127).

        NAME (имя)

        Использование в МОС ВП: EF_CLUSTER_NAME

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Имя кластера общих флагов событий, с которым  устанав-

  ливается связь. Аргумент NAME является адресом  дескриптора

  строки символов, который указывает на эту строку имени.

       Кластеры общих флагов событий доступны только для  тех

  процессов, которые имеют одинаковые номера  группы  UIC,  и

  каждый такой процесс должен устанавливать связь  с  класте-

  ром, используя одно  и  то  же  имя  (указанное  аргументом

  NAME). Операционная система МОС ВП неявно  связывает  номер

  группы UIC с этим именем, делая тем самым это имя  уникаль-

  ным для группы UIC.

       Если кластер находится в памяти,  разделяемой  многими

  процессорами, то имя, задаваемое  аргументом  NAME,  должно

  содержать имя той разделяемой памяти, где расположен  клас-




                           - 455 -

                        00152-01 97 06


  тер. В этом случае формат имени кластера следующий:

  имя-разделяемой-памяти: имя-кластера

        PROT

        Использование в МОС ВП: BOOLEAN

        Тип:                    байт (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Указатель защиты, который разрешает или запрещает дос-

  туп к кластеру общих флагов  событий  процессам  с  тем  же

  номером группы UIC, что и процесс, создавший кластер. Аргу-

  мент PROT есть длинное слово, значение которого интерпрети-

  руется как булево.

       Значение 0 указывает, что любой процесс с тем же номе-

  ром группы UIC, что и  процесс,  создавший  кластер,  может

  иметь доступ к этому кластеру  общих  флагов  событий.  Это

  значение принимается по умолчанию.  Значение  1  указывает,

  что только процесс с UIC совпадающим с UIC  процесса,  соз-

  давшего кластер, может иметь доступ к этому кластеру  общих

  флагов событий.

        PERM (постоянный)

        Использование в МОС ВП: BOOLEAN

        Тип:                    байт (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Указатель постоянности, который помечает, является  ли

  кластер общих  флагов  событий  постоянным  или  временным.

  Аргумент  PERM  -  это  длинное  слово,  значение  которого




                           - 456 -

                        00152-01 97 06


  интерпретируется как булево.

       Значение 0, принимаемое по умолчанию,  указывает,  что

  кластер временный. Значение 1 указывает, что  кластер  пос-

  тоянный.


       Описание.

       1) вызывающий процесс должен обладать следующими  при-

  вилегиями:

       2) привилегией PRMCEB для создания постоянного класте-

  ра общих флагов событий;

       Привилегией SHMEM для создания кластера  общих  флагов

  событий в памяти, разделяемой многими процессорами.

       При создании временных кластеров общих флагов  событий

  используется квота процесса для элементов в очереди таймера

  (TQELM). Создание постоянного кластера не оказывает влияния

  на данную квоту. Данная квота возвращается создателю  клас-

  тера, после того, как отсоединятся все процессы,  связанные

  с кластером.

       Создание кластера общих флагов событий  в  разделяемой

  памяти требует квоты CEF PORT. Данная квота устанавливается

  с помощью команды SHARE при генерации операционной  системы

  МОС ВП. При удалении кластера общих флагов событий эта кво-

  та восстанавливается.

       Когда какой-то процесс устанавливает связь с кластером

  общих флагов событий, счетчик обращений  к  этому  кластеру

  увеличивается на 1. Счетчик  обращений  уменьшается  на  1,

  когда процесс отсоединяется от кластера либо явно с помощью

  служебной программы $DACEFC,  либо  неявно  при  завершении



                           - 457 -

                        00152-01 97 06


  образа.

       Временные кластеры автоматически удаляются, когда зна-

  чение соответствующего счетчика обращений становится равным

  0. Постоянные кластеры должны явно помечаться для  удаления

  с помощью служебной программы $DLCEFC.

       Поскольку служебная  программа  $ASCEFC  автоматически

  создает кластер общих флагов событий, если его еще нет,  то

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

  какой из них выполнится первым, чтобы создать кластер. Пер-

  вый процесс, вызвавший программу $ASCEFC, создает  кластер,

  а другие устанавливают связь с ним, независимо от  порядка,

  в котором они вызывают программу.

       Во вновь созданном кластере общих флагов  событий  все

  флаги событий находятся в исходном состоянии 0.

       Если процесс установил связь с кластером,  указав  имя

  кластера общих флагов событий, а затем  выдал  новый  вызов

  программы $ASCEFC с тем же номером кластера,  то  программа

  сначала отсоединяет номер из первого  назначения,  а  зетем

  соединяет его со вторым.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_ACCVIO          - вызывающая  программа  не  может

                           прочитать  строку  имени  кластера

                           или дескриптор строки;

       SS$_EXPORTQUOTA     - процесс превысил число кластеров

                           общих флагов событий,  с  которыми

                           он мог установить связь через дан-



                           - 458 -

                        00152-01 97 06


                           ный порт многопортовой  (разделяе-

                           мой) памяти;

       SS$_EXQUOTA         - процесс превысил свою квоту чис-

                           ла элементов в очереди к  таймеру.

                           Данная квота контролирует создание

                           временных кластеров  общих  флагов

                           событий;

       SS$_INSFMEM         - для завершения  служебной  прог-

                           раммы нет  доступной  динамической

                           памяти достаточного размера;

       SS$_ILLEFC          - указан  неверный   номер   флага

                           события.  Номер  кластера   флагов

                           событий должен быть в диапазоне  с

                           64 по 127;

       SS$_INTERLOCK       - битовая маска захвата для  расп-

                           ределения кластеров  общих  флагов

                           событий из  указанной  разделяемой

                           памяти заблокирована  другим  про-

                           цессом;

       SS$_IVLOGNAM        - строка имени кластера имеет дли-

                           ну 0 или более 15 символов;

       SS$_NOPRIV          - процесс  не  имеет   привилегии,

                           необходимой для создания  постоян-

                           ного кластера.  Процесс  не  имеет

                           привилегии, необходимой для созда-

                           ния кластера общих флагов  событий

                           в памяти, разделяемой многими про-




                           - 459 -

                        00152-01 97 06


                           цессорами.   Защита,   назначенная

                           существующему  кластеру  создавшим

                           его процессом, запрещает  установ-

                           ление связи с этим кластером;

       SS$_NOSHMBLOCK      - нет доступного блока  управления

                           разделяемой памятью для  кластеров

                           общих флагов событий;

       SS$_SHMNOTCNCT      - разделяемая память, имя  которой

                           задано аргументом NAME, неизвестна

                           операционной системе МОС ВП.  Дан-

                           ная  ошибка  может  быть   вызвана

                           наличием неверного символа в стро-

                           ке, неверным назначением  логичес-

                           кого имени, или при генерации сис-

                           темы неудачно прошла идентификация

                           памяти как разделяемой.



       13.7. $ASCTIM  -   преобразовать   время   из

             системного  формата  в  строку  в  коде

             КОИ-8


       Служебная программа $ASCTIM преобразовывает абсолютное

  или дельта-время из 64-битового формата системного  времени

  в строку в коде КОИ-8.

       Формат:

       SYS$ASCTIM [TIMLEN],TIMBUF,[TIMADR],[CVTFLG]


       Аргументы:




                           - 460 -

                        00152-01 97 06


        TIMLEN

        Использование в МОС ВП: WORD_UNSIGNED

        Тип:                    слово (без знака)

        Доступ:                 только запись

        Механизм:               по ссылке

       Длина (в байтах) строки в коде кои-8, которую  возвра-

  щает программа $ASCTIM. Аргумент  TIMLEN  является  адресом

  слова, содержащего эту длину.

        TIMBUF

        Использование в МОС ВП: TIME_NAME

        Тип:                    текстовая строка

        Доступ:                 только запись

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Буфер, в который программа $ASCTIM пишет строку в коде

  КОИ-8. Аргумент TIMBUF является адресом дескриптора  строки

  символов, указывающего на буфер.

       Длина буфера, заданного в аргументе TIMBUF,  вместе  с

  аргументом CVTFLG управляет возвращаемой информацией.

        TIMADR

        Использование в МОС ВП: DATE_TIME

        Тип:                    квадрослово (без знака)

        Доступ:                 только чтение

        Механизм:               по ссылке

       Значение времени, которое должна преобразовывать прог-

  рамма  $ASCTIM.  Аргумент  TIMADR  является  адресом  этого

  64-битового значения времени. Положительное значение време-




                           - 461 -

                        00152-01 97 06


  ни представляет абсолютное  время.  Отрицательное  значение

  времени    представляет    дельта-время.    Если     задано

  дельта-время, то оно должно быть меньше 10000 дней.

       Если аргумент TIMADR не указан или задан равным 0  (по

  умолчанию), то программа $ASCTIM возвращает текущие дату  и

  время.

        CVTFLG

        Использование в МОС ВП: LONGWORD_UNSIGNED

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Индикатор преобразования, указывающий какие поля  даты

  и времени должна  возвращать  программа  $ASCTIM.  Аргумент

  CVTFLG является длинным словом, значение которого интерпре-

  тируется как булево. Значение 1  указывает,  что  программа

  $ASCTIM должна возвратить поля часов, минут, секунд и сотых

  долей секунды. Значение 0  (по  умолчанию)  указывает,  что

  программа $ASCTIM должна возвращать полную дату и время.


       Описание.

       Служебная программа $ASCTIM выполняется в режиме  дос-

  тупа вызывающей программы и не проверяет перед выполнением,

  доступны ли адресные аргументы. Следовательно, если входное

  значение времени нельзя прочитать, или если нельзя записать

  в выходной буфер или буфер длины, то нарушение доступа при-

  водит к исключительному состоянию.

       Данная программа не проверяет длину списка  аргументов

  и, следовательно, не может вернуть значение кода  состояния



                           - 462 -

                        00152-01 97 06


  SS$_INSFARG (недействительные аргументы).

       Возвращаемая строка в коде КОИ-8 имеет следующие  фор-

  маты:

       1) абсолютное время: DD-MMM-YYYY HH:MM:SS.CC;

       2) дельта-время: DDDD HH:MM:SS.CC.

       В табл. 43 приведены  составные  элементы  абсолютного

  времени и дельта-времени.


                                                  Таблица 43

   ---------------------------------------------------------

            ! Длина !                !

     Поле   !(в бай-!   Содержание   !  Диапазон значений

            ! тах)  !                !

   ---------------------------------------------------------

    DD      !   2   ! День месяца    !  1-31

    -       !   1   !   Дефис        ! Требование синтаксиса

    MMM     !   3   !   Месяц        ! JAN, FEB, MAR, APR,

            !       !                ! MAY, JUN, JUL, AUG,

            !       !                ! SEP, OCT, NOV, DEC

    -       !   1   !   Дефис        ! Требование синтаксиса

    YYYY    !   4   !   Год          ! 1858 - 9999

    Пробел  !   N   !   Пробел       ! Требование синтаксиса

    HH      !   2   !   Час          ! 00 - 23

    :       !   1   !   Двоеточие    ! Требование синтаксиса

    MM      !   2   !   Минуты       ! 00 - 59

    :       !   1   !   Двоеточие    ! Требование синтаксиса

    SS      !   2   !   Секунды      ! 00 - 59




                           - 463 -

                        00152-01 97 06


                                        Продолжение табл. 43

   ---------------------------------------------------------

            ! Длина !                !

     Поле   !(в бай-!   Содержание   !  Диапазон значений

            ! тах)  !                !

   ---------------------------------------------------------

    .       !   1   !   Точка        ! Требование синтаксиса

    CC      !   2   !   Сотые доли   ! 00 - 99

            !       !   секунды      !

    DDDD    !   4   !   Число дней   ! 0000 - 9999


       Поле сотых долей секунд представляет правильную дробь,

  например, строка .01 представляет одну сотую секунды.

       К полю сотых долей секунд можно добавить третью цифру.

  Этот разряд тысячных долей секунды используется для  округ-

  ления значения сотых долей секунды.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_BUFFEROVF       - длина буфера, указанная в  аргу-

                           менте TIMBUF слишком мала;

       SS$_IVTIME          - заданное дельта-время больше или

                           равно 10000 дней.



       13.8. $ASCTOID    -     транслировать     имя

             идентификатора в идентификатор


       Служебная программа $ASCTOID транслирует заданное  имя

  идентификатора в двоичное значение этого идентификатора.



                           - 464 -

                        00152-01 97 06


       Формат:

       SYS$ASCTOID NAME,[ID],[ATTRIB]


       Аргументы:

        NAME (имя)

        Использование в МОС ВП: CHAR_STRING

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Имя идентификатора, подлежащее трансляции в результате

  работы программы $ASCTOID. Аргумент NAME  является  адресом

  дескриптора, который указывает на имя идентификатора.

        ID (идентификатор)

        Использование в МОС ВП: RIGHTS_ID

        Тип:                    длинное слово (без знака)

        Доступ:                 только запись

        Механизм:               по ссылке

       Значение  идентификатора,  получающееся  в  результате

  работы программы $ASCTOID.  Аргумент  ID  является  адресом

  длинного слова, в которое записывается значение идентифика-

  тора.

        ATTRIB (атрибуты)

        Использование в МОС ВП: MASK_LONGWORD

        Тип:                    длинное слово (без знака)

        Доступ:                 только запись

        Механизм:               по ссылке





                           - 465 -

                        00152-01 97 06


       Атрибуты,  соответствующие   идентификатору,   который

  возвращается в аргументе ID по окончании  работы  программы

  $ASCTOID. Аргумент ATTRIB является адресом длинного  слова,

  содержащего битовую маску, задающую атрибуты.

       Символические значения  являются  смещениями  в  битах

  внутри длинного слова маски. Эти значения можно также полу-

  чить как  маску,  с  установленным  соответствующим  битом,

  используя вместо префикса KGB$V префикс KGB$M. Эти символи-

  ческие  значения  определены  в  системной  макробиблиотеке

  ($KGBDEF).

  Бит KGB$_RESORCE - позволяет держателю запрашивать для

                     идентификатора ресурсы типа блоков

                     на диске.


       Описание.

       Программа $ASCTOID преобразовывает заданное имя  иден-

  тификатора в двоичное значение этого идентификатора.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_ACCVIO          - вызвавшая  программа  не   может

                           прочитать аргумент  NAME,  или  не

                           может записать  аргументы  ID  или

                           ATTRIB;

       SS$_INSFMEM         - для открытия  базы  данных  прав

                           нет доступной динамической  памяти

                           процесса достаточного размера;

       SS$_NOSUCHID        - указанный  идентификатор   имеет




                           - 466 -

                        00152-01 97 06


                           неверный формат;

       SS$_IVIDENT         - указанное   имя   идентификатора

                           отсутствует в базе данных прав;

       RMS$_PRV            - пользователь не имеет доступа  с

                           чтением в базе данных прав.

       Поскольку база данных прав является индексным  файлом,

  доступ к которому осуществляется через систему  СУД-32,  то

  эта служебная программа может также возвращать коды состоя-

  ния системы СУД-32, связанные  с  операциями  с  индексными

  файлами (см. докумет [1]).



       13.9. $ASSIGN - назначить канал ввода-вывода


       Функции служебной программы $ASSIGN следующие:

       1)  обеспечение  процесса  каналом  ввода-вывода   для

  выполнения операций ввода-вывода на устройстве;

       2) установление логической связи с удаленным  узлом  в

  сети.

       Формат:

       SYS$ASSIGN DEVNAM,CHAN,[ACMODE],[MBXNAM]


       Аргументы:

        DEVNAM (имя устройства)

        Использование в МОС ВП: DEVICE_NAME

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины




                           - 467 -

                        00152-01 97 06


       Имя устройства, к которому  программа  $ASSIGN  должна

  назначить канал. Аргумент DEVNAM является адресом  дескрип-

  тора символьной строки, указывающего на строку имени.

       Если имя устройства содержит двойное  двоеточие  (::),

  то операционная система МОС ВП назначает  канал  к  первому

  доступному устройству сети и выполняет  функцию  доступа  в

  сети.

        CHAN (канал)

        Использование в МОС ВП: CHANNEL

        Тип:                    слово (без знака)

        Доступ:                 только запись

        Механизм:               по ссылке

       Номер  назначаемого  канала.  Аргумент  CHAN  является

  адресом слова, в которое программа $ASSIGN записывает номер

  канала.

        ACMODE (режим доступа)

        Использование в МОС ВП: ACCESS_MODE

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по назначению

       Режим доступа, который связывается с каналом. Аргумент

  ACMODE задает  режим  доступа.  Наиболее  привилегированным

  используемым режимом доступа является режим доступа вызвав-

  шей программы. Операции ввода-вывода в канале могут  выпол-

  няться только в равном или более привилегированных  режимах

  доступа.






                           - 468 -

                        00152-01 97 06


        MBXNAM (имя почтового ящика)

        Использование в МОС ВП: DEVICE_NAME

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Логическое имя почтового ящика, которое связывается  с

  устройством. Аргумент MBXNAM является  адресом  дескриптора

  строки символов указывающего на строку логического имени.

       Если аргумент MBXNAM задан равным 0, то с  устройством

  не может установить связь никакой почтовый ящик. Это значе-

  ние принимается по умолчанию.

       Только владелец устройства может установить связь поч-

  тового ящика с данным устройством.  Владелец  устройства  -

  это процесс, распределивший  устройство  явно  или  неявно.

  Одновременно с устройством может  установить  связь  только

  один почтовый ящик.

       Нельзя устанавливать связь почтового ящика с устройст-

  вом, которое имеет характеристику внешнее  (DEV$M_FOR)  или

  разделяемое (DEV$M_SHR).

       Почтовый ящик отсоединен от устройства, если  отсоеди-

  няется связанный с ним канал.

       Если почтовый ящик подсоединен к устройству, то  драй-

  вер этого устройства может посылать информацию состояния  в

  этот почтовый ящик.  Например,  если  устройством  является

  терминал, эта  информация  может  индицировать  коммутацию,

  зависание или  прием  незатребованной  входной  информации;




                           - 469 -

                        00152-01 97 06


  если устройством является устройство  сети,  то  информация

  состояния может индицировать, что  сеть  подсоединена  или,

  возможно, что линия отключилась (см.документ [2]).

       Описание.

       Для выполнения операций в сети вызывающий процесс дол-

  жен иметь привилегию NETMBX.

       Если требуемое устройство находится в удаленном  узле,

  то требуется системная динамическая память.

       Каналы остаются назначенными до тех пор,  пока  они  в

  явном виде не будут освобождены служебной программой "осво-

  бодить канал ввода-вывода" ($DASSGN), или, если это  каналы

  пользовательского режима, пока образ, назначивший канал, не

  завершится.

       Служебная программа $ASSIGN устанавливает путь к  уст-

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

  программа выполнить операции  ввода-вывода  на  устройстве.

  Привилегии  и  ограничения,  связанные  с  защитой,   могут

  использоваться драйверами устройств.

       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_REMOTE          - успешное завершение. Установлена

                           логическая связь с требуемым  уст-

                           ройством в удаленном узле;

       SS$_ABORT           - физическая линия отключилась  во

                           время операции соединения в сети;

       SS$_ACCVIO          - вызывающая программа  не  смогла

                           прочитать строку имени  устройства




                           - 470 -

                        00152-01 97 06


                           или почтового ящика, или не смогла

                           записать номер канала;

       SS$_DEVACTIVE       - задано имя почтового ящика, но с

                           этим  устройством  уже   установил

                           связь почтовый ящик;

       SS$_DEVALLOC        - предупреждение. Устройство расп-

                           ределено другому процессу;

       SS$_DEVNOTMBX       - задано логическое имя для почто-

                           вого ящика, однако, это имя  отно-

                           сится  к  устройству,  которое  не

                           является почтовым ящиком;

       SS$_EXQUOTA         - устройство, для которого  выпол-

                           няется  назначение,  находится   в

                           удаленном узле,  а  процесс  имеет

                           недостаточную  квоту  буфера   для

                           распределения  управляющего  блока

                           сети;

       SS$_INSFMEM         - устройство, для которого  выпол-

                           няется  назначение,  находится   в

                           удаленном узле, а  для  выполнения

                           этого запроса нет достаточной сис-

                           темной динамической памяти;

       SS$_IVDEVNAM        - не было указано имени  устройст-

                           ва, трансляция  логического  имени

                           закончилась неудачно, или имя уст-

                           ройства или почтового ящика содер-

                           жат  неверные  символы.  Если  имя




                           - 471 -

                        00152-01 97 06


                           устройства  задает  устройство   в

                           удаленном узле, то этот  код  сос-

                           тояния индицирует, что блок  подк-

                           лючения к сети имеет неверный фор-

                           мат;

       SS$_IVLOGNAM        - строка имени устройства или поч-

                           тового ящика  имеет  длину  0  или

                           содержит более 63 символов;

       SS$_NOIOCHAN        - нет канала ввода-вывода, доступ-

                           ного для назначения;

       SS$_NOLINKS         - для операций в сети нет  доступ-

                           ной  логической  связи.  Превышено

                           максимальное число логических свя-

                           зей, установленное  для  параметра

                           MAXIMUM  LINKS  (максимум  связей)

                           исполнительной программы NCP;

       SS$_NOPRIV          - задача,  выдавшая   запрос,   не

                           имеет  привилегии,  требуемой  для

                           выполнения операций  в  сети  или,

                           чтобы подтвердить указанную  логи-

                           ческую связь;

       SS$_NOSUCHDEV       - предупреждение.  Указанное  уст-

                           ройство  или  почтовый   ящик   не

                           существует;  или  для  операции  в

                           сети не загружен драйвер устройст-

                           ва сети;

       SS$_NOSUCHNODE      - указанный  узел  отсутствует   в




                           - 472 -

                        00152-01 97 06


                           сети или не доступен;

       SS$_REJECT          - подключение к сети было  отверг-

                           нуто программным обеспечением сети

                           или партнером на  удаленном  узле,

                           или образ завершился  прежде,  чем

                           было выдано подтверждение  подклю-

                           чения;

       SS$_CONNECFAIL      - для операций в сети. Подключение

                           к об'екту закончилось неудачно или

                           отложено;

       SS$_DEVOFFLINE      - для операций в сети.  Физическая

                           связь удалена из сети;

       SS$_FILALRACC       - для операций в сети.  Логическая

                           связь уже существует в канале;

       SS$_INVLOGIN        - для операций в сети.  Обнаружена

                           неверная информация контроля  дос-

                           тупа в удаленном узле;

       SS$_LINKEXIT        - для  операций  в  сети.   Задача

                           партнера  в  сети  стартовала,  но

                           вышла из системы прежде, чем  была

                           подтверждена   логическая    связь

                           (т.е. $ASSIGN для SYS$NET);

       SS$_NOSUCHOBJ       - для  операций  в   сети.   Номер

                           об'екта сети неизвестен в  удален-

                           ном узле;

       SS$_NOSUCHUSER      - для операций в  сети.  Удаленный

                           узел не мог распознавать  информа-




                           - 473 -

                        00152-01 97 06


                           цию  подключения  к   операционной

                           системе МОС ВП,  представленную  в

                           запросе на подключение;

       SS$_PROTOCOL        - для операций в  сети.  Произошла

                           ошибка в протоколе сети,  наиболее

                           вероятно из-за ошибки в  программ-

                           ном обеспечении сети;

       SS$_REMRSRC         - для операций в  сети.  Не  может

                           быть установлена связь из-за  нех-

                           ватки ресурсов операционной систе-

                           мы МОС ВП в удаленном узле;

       SS$_SHUT            - для операций в  сети.  Локальный

                           или удаленный узел больше не  при-

                           нимает подключений;

       SS$_THIRDPARTY      для операций в  сети.  Подключение

                           логической    связи     прекращено

                           третьей стороной (например,  адми-

                           нистратором системы);

       SS$_TOOMUCHDATA     - для операций в сети. Задача ука-

                           зала слишком много  необязательных

                           данных или данных прерываний;

       SS$_UNREACHABLE     - для операций в  сети.  Удаленный

                           узел в настоящее время недостижим.



       13.10. $BINTIM - преобразовать строку  в  коде

              КОИ-8 в двоичное значение времени






                           - 474 -

                        00152-01 97 06


       Служебная программа $BINTIM преобразовывает  строку  в

  коде КОИ-8 абсолютного времени или дельта-времени в  значе-

  ние в системном 64-битовом формате, удобном для использова-

  ния в качестве входного параметра  для  служебных  программ

  $SETIMR и $SCHDWK.

       Формат:

       SYS$BINTIM TIMBUF,TIMADR


       Аргументы:

        TIMBUF

        Использование в МОС ВП: TIME_NAME

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Аргумент TIMBUF задает адрес дескриптора строки симво-

  лов, указывающего на строку  времени  операционной  системы

  МОС ВП. Строка времени операционной системы МОС  ВП  указы-

  вает абсолютное время или дельта-время, преобразуемое прог-

  раммой $BINTIM.

        TIMADR

        Использование в МОС ВП: DATE_TIME

        Тип:                    квадрослово (без знака)

        Доступ:                 только запись

        Механизм:               по ссылке

       Аргумент TIMADR является адресом квадрослова, содержа-

  щего  системное  время.  В  это  квадрослово   записывается

  результат преобразования.



                           - 475 -

                        00152-01 97 06


       Описание.

       Служебная программа $BINTIM выполняется с тем  режимом

  доступа, который имеет вызывающий процесс, и  не  проверяет

  перед выполнением, доступны ли адресные аргументы. Следова-

  тельно, нарушение доступа вызывает  исключительное  состоя-

  ние, если нельзя прочитать  входной  буфер  или  дескриптор

  буфера или нельзя писать в выходной буфер.

       Данная служебная программа не проверяет  длину  списка

  аргументов и, следовательно, не может возвращать  код  оши-

  бочного состояния SS$_INSFARG (недействительные аргументы).

  Если данная  служебная  программа  не  получила  достаточно

  аргументов (например, если опущены нужные запятые в формате

  вызова), может произойти ошибка.

       Требуемая входная строка в коде КОИ-8 имеет  следующий

  формат:

       1) абослютное время: DD-MMM-YYYY HH:MM:SS.CC

       2) дельта-время:     DDDD HH:MM:SS.CC

       Для спецификации входной строки в коде  кои-8  исполь-

  зуются следующие правила:

       1) можно опускать любое из полей времени и даты.

       Для значений абсолютного времени  служебная  программа

  $BINTIM заполняет неуказанные поля текущим  значением  сис-

  темной даты и времени. Последние поля могут усекаться. Если

  опускаются начальные  поля,  то  необходимо  указать  знаки

  пунктуации (дефисы, пробелы, двоеточия и точки).  Например,

  для 12:00 текущего дня задается следующая строка абсолютно-

  го времени:




                           - 476 -

                        00152-01 97 06


       Пример.

          --12:00:00.00

       Для  значений   дельта-времени   служебная   программа

  $BINTIM использует для неуказанных  полей  часов,  минут  и

  секунд значение по умолчанию 0. Последние поля  могут  усе-

  каться. Если в значении времени опущены начальные поля,  то

  необходимо указать знаки  пунктуации  (пробелы,  двоеточия,

  точки). Если число дней в дельта-времени равно 0, то  необ-

  ходимо указать 0. Например, для времени 10 секунд  задается

  следующая строка:

          0 ::10

       Пробел между 0 в поле дней и двумя двоеточиями необхо-

  дим;

       2)  для  значений  как  абсолютного  времени,  так   и

  дельта-времени можно использовать любое число ведущих  про-

  белов и любое число пробелов между полями, обычно разделен-

  ными пробелами.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_IVTIME          - неверный   синтаксис    заданной

                           строки в коде КОИ-8 или компонента

                           времени лежит вне диапазона.

       Примеры:

       Входная стока для             выходная строка для

       Программы $BINTIM             программы $ASCTIM



       1. -:30                       16-MAY-1986 15:30:00.00



                           - 477 -

                        00152-01 97 06


       2. 20-FEB-1987 16:35:1.1161   20-FEB-1987 16:35:01.12

       3. 0 ::.1                     0 00:00:00.10

       4. 20 12:                     20 12:00:00.00



       13.11. $BRKTHRU- разослать сообщение


       Служебная программа $BRKTHRU посылает сообщение одному

  или нескольким терминалам.

       Служебная программа $BRKTHRU  завершается  асинхронно,

  т.е. она возвращает управление вызывающей  программе  после

  того, как поставит в очередь запрос на сообщение,  не  ожи-

  дая, пока сообщение будет выведено на указанный терминал.

       Для синхронного завершения следует  использовать  слу-

  жебную программу $BRKTHRUW ("разослать сообщение и ждать").

  Программа $BRKTHRUW полностью идентична программе $BRKTHRU,

  за исключением того,  что  программа  $BRKTHRUW  возвращает

  управление вызывающей программе после того,  как  сообщение

  будет выведено на указанный терминал (см. подраздел 2.5).

       Формат:

        SYS$BRKTHRU   [EFN],[MSGBUF],[SENDTO],[SNDTYP],

                      [IOSB],[CARCON],[FLAGS],[REGID],

                      [TIMOUT],[ASTADR],[ASTPRM]


       Аргументы:

        EFN (номер флага события)

        Использование в МОС ВП: EF_NUMBER

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение




                           - 478 -

                        00152-01 97 06


        Механизм:               по значению

       Номер флага события, который  должен  быть  установлен

  после вывода сообщения на указанный терминал. Аргумент  EFN

  является длинным словом, содержащим данный номер.

       Когда запрос на сообщение ставится в очередь, програм-

  ма $BRKTHRU сбрасывает указанный флаг события (или флаг  0,

  если не задан аргумент EFN).  Когда  сообщение  отсылается,

  программа $BRKTHRU  устанавливает  указанный  флаг  события

  (или флаг 0).

        MSGBUF (буфер сообщения)

        Использование в МОС ВП: CHAR_STRING

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Текст сообщения, котрое посылается указанному термина-

  лу. Аргумент MSGBUF является адресом дескриптора, указываю-

  щего на текст этого сообщения.

       Служебная программа $BRKTHRU  разрешает  длину  текста

  сообщения в 16350  байтов,  однако  на  максимальную  длину

  текста сообщения может влиять как параметр MAXBUF, заданный

  при генерации операционной системы МОС ВП, так и допустимое

  пространство процесса.

        SENDTO

        Использование в МОС ВП: CHAR_STRING

        Тип:                    текстовая строка

        Доступ:                 только чтение




                           - 479 -

                        00152-01 97 06


        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Имя отдельного устройства  (терминала)  или  отдельное

  имя пользователя, которому полылается  сообщение.  Аргумент

  SENDTO является адресом дескриптора, указывающего на данное

  имя.

       Аргумент  SENDTO  используется  вместе  с   аргументом

  SNDTYP. Если аргумент  SNDTYP  указывает  BRK$C_DEVICE  или

  BRK$C_USERNAME, то аргумент SENDTO обязателен, поскольку он

  указывает имя устройства  или  имя  пользователя,  которому

  должно посылаться сообщение.

       Если  аргумент  SNDTYP  не  указан   или   задает   не

  BRK$C_DEVICE или BRK$C_USERNAME, то аргумент SENDTO не сле-

  дует указывать, если же он указан,  то  программа  $BRKTHRU

  его игнорирует.

        SNDTYP

        Использование в МОС ВП: LONGWORD_UNSIGNED

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Тип терминала, которому программа $BRKTHRU должна пос-

  лать сообщение. Аргумент SNDTYP  является  длинным  словом,

  значение которого задает тип терминала.

       Каждый тип терминала имеет символическое имя,  опреде-

  ленное с помощью макрокоманды $BRKDEF. В табл. 44 представ-

  лены типы терминалов.






                           - 480 -

                        00152-01 97 06


                                                  Таблица 44

  ----------------------------------------------------------

  Тип терминала         !        Описание

  ----------------------------------------------------------

  BRK$C_ALLUSERS        ! Если задан данный тип, то программ

                        ! $BRKTHRU посылает сообщение всем

                        ! пользователям, подключенным к опе-

                        ! рационной системе МОС ВП в настоя-

                        ! щее время

  BRK$C_ALLTERMS        ! Если задан данный тип, то программ

                        ! $BRKTHRU посылает сообщение всем

                        ! терминалам, на которых пользовате-

                        ! ли подключены к операционной сис-

                        ! теме МОС ВП, и всем другим терми-

                        ! налам, которые подключены к сис-

                        ! теме, за исключением тех, у кото-

                        ! рых установлена характеристика

                        ! AUTOBAUD

  BRK$C_DEVICE          ! Если задан данный тип, то программ

                        ! $BRKTHRU посылает сообщение отде-

                        ! льному терминалу. Имя данного тер-

                        ! минала должно указываться в аргу-

                        ! менте SENDTO

  BRK$C_USERNAME        ! Если указан данный тип, то програм

                        ! ма $BRKTHRU посылает сообщение

                        ! пользователю с указанным именем

                        ! пользователя, которое задается




                           - 481 -

                        00152-01 97 06


                                        Продолжение табл. 44

  ----------------------------------------------------------

  Тип терминала         !        Описание

  ----------------------------------------------------------

                        ! в аргументе SENDTO


        IOSB (блок состояния ввода-вывода)

        Использование в МОС ВП: IO_STATUS_BLOCK

        Тип:                    квадрослово (без знака)

        Доступ:                 только запись

        Механизм:               по ссылке

       Блок состояния ввода-вывода, который получает конечное

  состояние завершения. Аргумент IOSB является адресом данно-

  го блока размером в квадрослово.

       Если указан  аргмумент  IOSB,  то  программа  $BRKTHRU

  обнуляет данное квадрослово, когда  она  ставит  в  очередь

  запрос на сообщение. Затем, когда сообщение  отсылается  на

  указанный терминал, программа  $BRKTHRU  возвращает  четыре

  информационных элемента, по элементу на слово, в квадросло-

  во блока состояния ввода-вывода.

       Данные информационные  элементы  индицируют  состояния

  сообщений, посылаемых только тем терминалам и почтовым яши-

  кам, которые расположены в  локальных  узлах  сети.  Данные

  элементы не включают состояния сообщений, посылаемых терми-

  налам и почтовым ящикам в других узлах сети и кластерах.

       В табл. 45 перечислены по порядку все слова квадросло-

  ва блока состояния ввода-вывода и информационные  элементы,

  которые они содержат.



                           - 482 -

                        00152-01 97 06



                                                  Таблица 45

  ----------------------------------------------------------

  Слово   !            Информационный элемент

  ----------------------------------------------------------

   1      ! Значение кода состояния, описывающее конечное

          ! состояние завершения

   2      ! Десятичное число, индицирующее число терминалов

          ! и почтовых ящиков, которым программа $BRKTHRU

          ! успешно отослала сообщение

   3      ! Десятичное число, индицирующее число терминалов,

          ! которым программе $BRKTHRU не удалось послать

          ! сообщение, поскольку запись на терминал была

          ! заблокирована

   4      ! Десятичное число, индицирующее число терминалов,

          ! которым программе $BRKTHRU не удалось послать

          ! сообщение, поскольку для этих терминалов была

          ! установлена характеристика NOBROADCAST (с по-

          ! мощью команды SET TERMINAL/NOBROADCAST языка

          ! DCL)


        CARCON

        Использование в МОС ВП: LONGWORD_UNSIGNED

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Спецификатор управления кареткой, индицирующий  после-

  довательность символов управления кареткой терминала, кото-




                           - 483 -

                        00152-01 97 06


  рая должна следовать за сообщением,  посылаемым  программой

  $BRKTHRU терминалам. Аргумент CARCON является длинным  сло-

  вом, содержащим спецификатор управления кареткой.

       Если аргумент CARCON не задан, то  программа  $BRKTHRU

  использует значение по умолчанию 32,  которое  представляет

  пробел в наборе символов кода  КОИ-8.  Формат  сообщения  с

  этим значением по умолчанию представляет из себя переход на

  новую строку, текст сообщения и возврат каретки.

       Аргумент CARCON не оказывает никакого влияния на  фор-

  матирование  сообщения,  заданного  флагом  BRK$M_SCREEN  в

  аргументе FLAGS.

        FLAGS

        Использование в МОС ВП: MASK_LONGWORD

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Битовая  маска  флагов,  задающая  возможные  операции

  программы $BRKTHRU. Аргумент FLAGS является длинным словом,

  значение которого является логическим "или" желаемых опера-

  ций, заданных флагами.

       Каждая операция, задаваемая флагом, имеет  символичес-

  кое имя. Данные имена определяются макрокомандой $BRKDEF.

       В табл. 46 представлены данные символические имена.












                           - 484 -

                        00152-01 97 06


                                                   Таблица 46

  -----------------------------------------------------------

  Символическое имя  ! Описание

  -----------------------------------------------------------

  BRK$V_ERASE_LINES  ! Если данный флаг задан вместе с флагом

                     ! BRK$M_SCREEN, то перед выводом сооб-

                     ! щения на экран дисплея, с него стира-

                     ! ется указанное число строк. Если флаг

                     ! BRK$M_SCREEN не задан, то флаг BRK$V_

                     ! ERASE_LINES игнорируется.

                     ! В отличие от других булевых флагов,

                     ! флаг BRK$V_ERASE_LINES задает 1-бай-

                     ! товое целое число в диапазоне от 0 до

                     ! 24. Он занимает первый байт в длин-

                     ! ном слове маски флагов

  BRK$M_SCREEN       ! Если задан данный флаг, то программа

                     ! $BRKTHRU посылает сообщения, формати-

                     ! рованные на весь экран, а также сооб-

                     ! щения форматированные с помощью ар-

                     ! гумента CARCON. Программа $BRKTHRU

                     ! посылает сообщения, форматированные

                     ! на весь экран, тем терминалам, кото-

                     ! рые имеют характеристику DEC_CRT, а

                     ! сообщения, форматированные с помощью

                     ! аргумента CARCON на терминалы без

                     ! характеристики DEC_CRT. Характерис-

                     ! тика DEC_CRT устанавливается терми-




                           - 485 -

                        00152-01 97 06


                                         Продолжение табл. 46

  -----------------------------------------------------------

  Символическое имя  ! Описание

  -----------------------------------------------------------

                     ! налу с помощью команды SET TERMINAL/

                     ! DEC_CRT языка DCL.

                     ! Сообщение, форматированное на весь

                     ! экран, выводится с верхней строки

                     ! экрана терминала, а курсор устанав-

                     ! ливается в точку, предшествующую

                     ! присланному сообщению. Однако на

                     ! этот вывод могут влиять флаги

                     ! BRK$V_ERASE_LINES и BRK$M_BOTTOM

  BRK$M_BOTTOM       ! Если задан данный флаг, а также

                     ! флаг  BRK$M_SCRREN, то программа

                     ! $BRKTHRU пишет сообщение в нижней

                     ! части экрана, а не в верхней.

                     ! Если же флаг BRK$M_SCREEN не задан,

                     ! то флаг BRK$M_BOTTOM игнорируется

  BRK$M_NOREFRESH    ! Если задан данный флаг, то программа

                     ! $BRKTHRU после вывода сообщения на

                     ! экран не выводит заново на экран

                     ! последнюю строку операции чтения,

                     ! которая была прервана присланным

                     ! сообщением. Данный флаг полезен

                     ! только, если не задан флаг BRK$M_

                     ! SCREEN поскольку операция BRK$M_




                           - 486 -

                        00152-01 97 06


                                         Продолжение табл. 46

  -----------------------------------------------------------

  Символическое имя  ! Описание

  -----------------------------------------------------------

                     ! NOREFRESH является принимаемой по

                     ! умолчанию для сообщений, формати-

                     ! рованных на весь экран

  BRK$M_CLUSTER      ! Если указывается данный флаг, то

                     ! программа $BRKTHRU получает воз-

                     ! можность посылать сообщения тер-

                     ! миналам и почтовым ящикам в другие

                     ! узлы из кластера.

                     ! Если данная операция не задана, то

                     ! программа $BRKTHRU посылает сообще-

                     ! ния только тем терминалам и почто-

                     ! вым ящикам, которые расположены в

                     ! локальном узле


        REGID

        Использование в МОС ВП: LONGWORD_UNSIGNED

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Идентификация класса требования,  которая  идентифици-

  рует для программы $BRKTHRU ту программу пользователя  (или

  образ), которая вызывает программу $BRKTHRU. Аргумент REGID

  является длинным словом, содержащим значение идентификации.





                           - 487 -

                        00152-01 97 06


       Аргумент REGID используется различными образами опера-

  ционной системы МОС ВП, которые посылают сообщения термина-

  лам и может быть использован 16 различными образами пользо-

  вателя.

       Когда такой образ вызывает программу $BRKTHRU, задавая

  аргумент REGID, программа $BRKTHRU извещает  терминал,  что

  этот образ желает послать сообщение на данный терминал. Это

  дает возможность пользователю терминала разрешить или  зап-

  ретить образу посылать сообщение на терминал.

       Чтобы запретить конкретному образу посылать  сообщение

  на терминал пользователя, этот пользователь должен  исполь-

  зовать   имя   образа   в    команде    языка    DCL    SET

  TERMINAL/NOBROADCAST=имя-образа. Имя-образа в этой  команде

  DCL должно совпадать со значением аргумента REGID,  которое

  образ передал программе $BRKTHRU.

       Например, пользователь  терминала,  используя  команду

  DCL SET TERMINAL/NOBROADCAST=MAIL может запретить  обслужи-

  вающей программе MAIL операционной системы МОС ВП  (которая

  является образом) писать сообщение на терминал.

       Макрокоманда $BRKDEF определяет имена классов, которые

  используются различными компонентами  операционной  системы

  МОС ВП. Эти компоненты задают свое  имя  класса,  используя

  аргумент REGID при вызове программы $BRKTHRU.  Макрокоманда

  $BRKDEF также определяет 16 имен классов (с BRK$C_USER1  по

  BRK$C_USER16)  для  использования  образами  пользователей,

  которые вызывают программу $BRKTHRU.

       В табл. 47 приведены все имена классов  и  компоненты,




                           - 488 -

                        00152-01 97 06


  которым они соответствуют.

                                                  Таблица 47

  ----------------------------------------------------------

  Имя класса    !                Компонента

  ----------------------------------------------------------

  BRK$C_GENERAL ! Данное имя класса используется:

                ! 1) образом операционной системы МОС ВП,

                !    который вызывается командой REPLY языка

                !    DCL;

                ! 2) образом, вызвавшим программу $BRKTHRU.

                ! это по умолчанию, если не задан аргумент

                ! REGID

  BRK$C_PHONE   ! Данное имя класса используется обслуживаю-

                ! щей программой PHONE

  BRK$C_MAIL    ! Данное имя класса используется обслуживаю-

                ! щей программой MAIL

  BRK$C_DCL     ! Данное имя класса используется интерпрета-

                ! тором команд языка DCL для команды YC/T,

                ! которая выводит на дисплей состояние

                ! процесса

  BRK$C_QUEUE   ! Данное имя класса используется программой

                ! управления очередями, которая управляет

                ! печатью и пакетными заданиями

  BRK$C_SHUTDOWN! Данное имя класса используется образом ос-

                ! танова операционной системы МОС ВП, ко-

                ! торый вызывается командой DCL REPLY/ID=

                ! SHUTDOWN




                           - 489 -

                        00152-01 97 06


                                        Продолжение табл. 47

  ----------------------------------------------------------

  Имя класса    !                Компонента

  ----------------------------------------------------------

  BRK$C_URGENT  ! Данное имя класса используется образом опе

                ! рационной системы МОС ВП, который вызы-

                ! вается командой DREPLY/ID=UTBRK$C_USER1

  BRK$C_USER1   ! Данные имена классов могут использовать

      ПО        ! образы, написанные пользователями

  BRK$C_USER16  !


        TIMOUT (время блокировки)

        Использование в МОС ВП: LONGWORD_UNSIGNED

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Значение  временной  остановки,  представляющее  число

  секунд, которое должно пройти прежде, чем попытка программы

  $BRKTHRU сделать вывод на терминал,  будет  рассматриваться

  как  удачная.  Аргумент  TIMOUT  является  длинным  словом,

  содержащим это значение (в секундах).

       Поскольку программа $BRKTHRU вызывает служебную  прог-

  рамму $QIO для выполнения вывода на терминал,  то  значение

  времени блокировки задает число  секунд,  которое  выделено

  служебной программе  $QIO  для  выполнения  одной  операции

  вывода на терминал.

       Если аргумент TIMOUT не задан, то  программа  $BRKTHRU

  использует значение по умолчанию 0 секунд,  которое  указы-



                           - 490 -

                        00152-01 97 06


  вает бесконечное время, т.е. программа $BRKTHRU  не  блоки-

  руется по времени.

       Значение, задаваемое  аргументом  TIMOUT,  может  быть

  равным 0 или любым числом больше 4; числа 1,2,3 и  4  недо-

  пустимы.

       Если на терминале пользователя нажата клавиша YC/S, то

  программа $BRKTHRU не может  послать  сообщение  на  данный

  терминал. В  таком  случае  значение,  заданное  аргументом

  TIMOUT, будет очевидно превышено и попытка записи на данный

  терминал закончится неудачно.

        ASTADR

        Использование в МОС ВП: AST_PROCEDURE

        Тип:                    маска входа в процедуру

        Доступ:                 вызов без развертывания

                                стека

        Механизм:               по ссылке

       Процедура AST, которая должна выполняться после  того,

  как программа $BRKTHRU пошлет сообщение на указанный терми-

  нал. Аргумент ASTADR является адресом маски входа этой про-

  цедуры.

       Если задан аргумент ASTADR,  то  процедура  AST  будет

  выполняться с тем же режимом доступа, что и  процесс,  выз-

  вавший программу $BRKTHRU.

        ASTPRM

        Использование в МОС ВП: USER_ARG

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение




                           - 491 -

                        00152-01 97 06


        Механизм:               по значению

       Параметр AST, который  должен  передаваться  процедуре

  AST, заданный аргументом  ASTPRM.  Аргумент  ASTPRM  задает

  этот параметр размером в длинное слово.


       Описание.

       Вызывающий процесс должен иметь привилегию OPER, чтобы

  послать сообщение либо нескольким терминалам, либо термина-

  лу, который распределен другому пользователю.

       Вызывающий процесс должен иметь привилегию WORLD, что-

  бы послать сообщение конкретному пользователю, задавая сим-

  волический код BRK$C_USERNAME для аргумента SNDTYP.

       Служебная программа  $BRKTHRU  допускает  максимальную

  длину текста сообщения 16350 байтов, однако  на  эту  длину

  может повлиять параметр MAXBUF, заданный при генерации опе-

  рационной системы МОС ВП, и доступное пространство вызываю-

  щего процесса.

       Служебная программа $BRKTHRU назначает канал к  терми-

  налу, используя программу $ASSIGN, и затем пишет на  данный

  терминал сообщение, используя программу $QIO. Вызывая прог-

  рамму $QIO, служебная программа $BRKTHRU задает код функции

  IO$_WRITEVBLK    вместе    с     модификаторами     функции

  IO$M_BREAKTHRU,     IO$M_CANCTRLO     и     (необязательно)

  IO$M_REFRESH.

       Текущее состояние терминала определяет,  выводится  ли

  посланное сообщение на экран и когда:

       1) если  терминал  выполняет  операцию  чтения,  когда

  программа $BRKTHRU посылает сообщение, то  данная  операция



                           - 492 -

                        00152-01 97 06


  чтения приостанавливается, сообщение выводится на экран,  а

  затем заново выводится на экран та строка, которая считыва-

  лась, когда операция чтения была приостановлена. (это экви-

  валентно действию в результате нажатия клавиш YC/R);

       2) если  терминал  выполняет  операцию  записи,  когда

  программа $BRKTHRU посылает сообщение, то данное  сообщение

  выводится на экран после завершения текущей операции  запи-

  си;

       3) сообщение не  выводится  на  экран,  если  терминал

  установил характеристику NOBRODCAST для всех  образов,  или

  если терминал запретил прием сообщений от  образа,  который

  вызывает программу $BRKTHRU.

       После вывода на экран сообщения, терминал возвращается

  в состояние, в котором он был до получения сообщения.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_ACCVIO          - вызывающий процесс не может про-

                           читать буфер сообщения, дескриптор

                           буфера  сообщения,  строку   имени

                           устройтсва или  дескриптор  строки

                           имени устройства;

       SS$_BADPARAM        - длина сообщения превысила  16350

                           байтов. Недостаточная квота лимита

                           счетчика байтов (BYTLM)  буферизо-

                           ванного ввода-вывода  для  данного

                           процесса; длина  сообщения  превы-

                           шает значение, заданное при  гене-



                           - 493 -

                        00152-01 97 06


                           рации параметром MAXBUF;

       SS$_EXQUOTA         - процесс превысил свою квоту раз-

                           мера буфера и отключил режим  ожи-

                           дания ресурса с помощью  программы

                           $SETRWM;

       SS$_INSFMEM         - для выполнения запроса нет  дос-

                           тупной динамической памяти системы

                           достаточного  размера  и   процесс

                           отключил режим ожидания ресурса  с

                           помощью программы $SETRWM;

       SS$_NONLOCAL        - предупреждение. Устройство нахо-

                           дится в удаленном узле;

       SS$_NOOPER          - процесс  не  имеет   необходимую

                           привилегию OPER;

       SS$_NOSUCHDEV       - предупреждение. Указанный терми-

                           нал не  существует  или  не  может

                           принять сообщение.


       Значения кодов состояния, возвращаемые в блок  состоя-

  ния ввода-вывода.

       Все значения кодов состояния, возвращаемые  служебными

  программами $ASSIGN, $FAO, $GETDVI, $GETJPI и $QIO.



       13.12. $BRKTHRUW - разослать сообщение и ждать


       Служебная программа $BRKTHRUW посылает сообщение одно-

  му или нескольким терминалам.

       Служебная программа $BRKTHRUW работает синхронно, т.е.




                           - 494 -

                        00152-01 97 06


  она возвращает  управление  вызвавшему  ее  процессу  после

  того, как сообщение посылается указанному терминалу.

       Для асинхронных операций следует использовать  служеб-

  ную программу $BRKTHRU, которая возвращает управление  выз-

  вавшему ее процессу, поставив в очередь запрос  на  сообще-

  ние, не ожидая, пока сообщение  будет  доставлено  адресату

  (см. подраздел 2.5).

       Во всех других отношениях программа $BRKTHRU полностью

  идентична программе $BRKTHRUW.

       Формат:

          SYS$BRKTHRUW    [EFN],MSGBUF,[SENDTO],[SNDTYP],

                          [IOSB],[CARCON],[FLAGS],[REGID],

                          [TIMOUT],[ASTADR],[ASTPRM]



       13.13. $CANCEL - отменить ввод-вывод в канале


       Служебная программа $CANCEL отменяет все невыполненные

  запросы на ввод-вывод в указанном канале. Включает все зап-

  росы на ввод-вывод, стоящие  в  очереди,  а  также  запрос,

  выполняющийся в текущий момент.

       Формат:

       SYS$CANCEL CHAN


       Аргумент:

        CHAN

        Использование в МОС ВП: CHANNEL

        Тип:                    слово (без знака)

        Доступ:                 только чтение




                           - 495 -

                        00152-01 97 06


        Механизм:               по значению

       Канал ввода-вывода, в котором  отменяется  ввод-вывод.

  Аргумент CHAN является  длинным  словом,  содержащим  номер

  канала.


       Описание.

       Чтобы отменить  ввод-вывод  в  канале,  режим  доступа

  вызывающего процесса должен быть равен или более привилеги-

  рованный, чем режим доступа того процесса, который первона-

  чально назначил этот канал.

       Служебная  программа  $CANCEL  запрашивает   системную

  динамическую память и использует квоту лимита  процесса  на

  ввод-вывод с буферизацией (BIOLM).

       Если отменяется запрос, который выполняется в  текущий

  момент времени, то драйвер сразу  же  извещается  об  этом.

  Реальная отмена может произойти сразу же или нет в  зависи-

  мости от логического состояния драйвера.  Когда  происходит

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

  ввода-вывода, подобно  тому,  что  делается  для  запросов,

  стоящих в очереди, а именно:

       1) устанавливается указанный флаг события;

       2) если задан блок состояния ввода-вывода,  то  в  его

  первом слове устанавливается код SS$_CANCEL для запроса  на

  ввод-вывод, стоящего в очереди, или SS$_ABORT для выполняю-

  щегося ввода-вывода;

       3) если задано AST, то оно ставится в очередь.

       Правильная синхронизация между этой служебной програм-

  мой и реальной отменой запроса на ввод-вывод, требует, что-



                           - 496 -

                        00152-01 97 06


  бы вызывающий процесс ожидал завершения ввода-вывода  обыч-

  ным способом, а затем был извещен об отмене ввода-вывода.

       Если операция ввода-вывода является виртуальной опера-

  цией ввода-вывода, включающей дисковый  или  ленточный  ACP

  (вспомогательный управляющий процесс), то такой  ввод-вывод

  нельзя отменить. Однако в  случае  магнитной  ленты  отмена

  может быть выполнена, если драйвер устройства  находится  в

  "нерабочем" состоянии.

       Невыполненные  запросы  на  ввод-вывод   автоматически

  отменяются, когда образ завершается.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_EXQUOTA         - процесс  превысил   свою   квоту

                           лимита на ввод-вывод  с  буфериза-

                           цией;

       SS$_INSFMEM         - для отмены ввода-вывода нет дос-

                           тупной   системной    динамической

                           памяти достаточного размера;

       SS$_IVCHAN          - был указан неверный канал,  т.е.

                           номер канала равный 0  или  больше

                           числа доступных каналов;

       SS$_NOPRIV          указанный канал  не  назначен  или

                           назначен из более  привилегирован-

                           ного режима доступа.









                           - 497 -

                        00152-01 97 06


       13.14. $CANEXH - отменить обработчик выхода


       Служебная программа $CANEXH  удаляет  блок  управления

  выходом из списка управляющих блоков для вызывающего режима

  доступа. Блоки управления выходом  об'являются  при  помощи

  служебной программы $DCLEXH и  ставятся  в  очередь,  соот-

  ветствующую режиму доступа, в порядке "последним  пришел  -

  первым обслужен".

       Формат:

       SYS$CANEXH [DESBLK]


       Аргумент:

        DESBLK

        Использование в МОС ВП: EXIT_HANDLER_BLOCK

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по ссылке

       Управляющий блок, который описывает  отменяемый  обра-

  ботчик выхода. Аргумент DESBLK - это адрес  данного  управ-

  ляющего блока. Если DESBLK не задан или  задан  как  0,  то

  отменяются все блоки управления выходом для текущего режима

  доступа.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_ACCVIO          вызывающая программа не может про-

                           читать первое длинное слово  теку-

                           щего или предыдущего блока  управ-

                           ления выходом, или  она  не  может



                           - 498 -

                        00152-01 97 06


                           записать длинное слово в предшест-

                           вующий управляющий блок;

       SS$_IVSSRQ          - данный вызов служебной программы

                           недопустим, потому что  он  сделан

                           из режима ядра;

       SS$_NOHANDLER       - указанный обработчик  выхода  не

                           существует.



       13.15. $CANTIM - отменить запрос к таймеру


       Служебная программа $CANTIM отменяет все или выбранное

  подмножество запросов на установку таймера,  которые  выдал

  ранее текущий образ, выполняющийся в процессе. Отмена осно-

  вана на использовании  идентификации  запроса,  заданной  в

  служебной программе $SETIMR.  Если  нескольким  запросам  к

  таймеру была дана одна и та же  идентификация  запроса,  то

  отменяются все запросы с такой идентификацией.

       Формат:

       SYS$CANTIM [REQIDT],[ACMODE]


       Аргументы:

        REQIDT

        Использование в МОС ВП: USER_ARG

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Идентификация запроса к таймеру,  подлежащего  отмене.

  Аргумент REQIDT -  это  длинное  слово,  содержащее  данную




                           - 499 -

                        00152-01 97 06


  идентификацию. Если REQIDT задан как 0 (принято по  умолча-

  нию), то отменяются все запросы к таймеру.

        ACMODE

        Использование в МОС ВП: ACCESS_MODE

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Режимы доступа запроса, подлежащего  отмене.  Аргумент

  ACMODE - это длинное слово, содержащее режим доступа.  Мак-

  рокоманда $PSLDEF определяет для  четырех  режимов  доступа

  следующие обозначения:

       1) PSL$C_KERNEL - режим ядра;

       2) PSL$C_EXEC - режим управления;

       3) PSL$C_SUPER - супервизорный режим;

       4) PSL$C_USER - пользовательский режим.

       Режим доступа вызывающей программы  является  наиболее

  привилегированным режимом доступа. Можно отменить только те

  запросы к таймеру, которые были выданы из  режима  доступа,

  имеющего  равную  или  низшую  привилегию  по  сравнению  с

  результирующим режимом доступа.


       Описание.

       Вызывающий процесс может отменить только те запросы  к

  таймеру, которые были выданы процессом, имеющим  привилегию

  режима доступа, равную или меньшую по сравнению с  вызываю-

  щим процессом.

       При завершении образа невыполненные запросы к  таймеру

  автоматически отменяются.



                           - 500 -

                        00152-01 97 06


       Возвращаемое значение кода состояния:

       SS$_NORMAL          - успешное завершение.



       13.16. $CANWAK - отменить пробуждение


       Служебная программа $CANWAK удаляет из очереди к  тай-

  меру все запросы на запланированное пробуждение какого-либо

  процесса, включая те запросы, которые были сделаны вызываю-

  щим процессом или другими процессами. Запросы на запланиро-

  ванное пробуждение выдаются при помощи служебной  программы

  $SCHDWK.

       Формат:

       SYS$CANWAK [PIDADR],[PRCNAM]


       Аргументы:

        PIDADR

        Использование в МОС ВП: PROCESS_ID

        Тип:                    длинное слово (без знака)

        Доступ:                 модификация

        Механизм:               по ссылке

       Идентификатор процесса (PID), для  которого  требуется

  отменить пробуждение. Аргумент PIDADR - это адрес  длинного

  слова, задающего PID.

        PRCNAM

        Использование в МОС ВП: PROCESS_NAME

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескриптор




                           - 501 -

                        00152-01 97 06


                                строки фиксированной длины

       Имя процесса, для которого требуется отменить  пробуж-

  дение. Аргумент PRCNAM - это адрес  дескриптора  символьной

  строки, указывающего на строку имени процесса.

       Операционная система МОС ВП интерпретирует номер груп-

  пы UIC вызывающего процесса как часть имени процесса; имена

  процессов уникальны внутри  группы  UIC.  Поэтому  аргумент

  PRCNAM можно использовать только для процессов, входящих  в

  ту же группу, что и вызывающий процесс.


       Описание.

       В зависимости  от  конкретной  операции  использование

  программы $CANWAK может потребовать наличия  у  вызывающего

  процесса определенных привилегий:

       1) чтобы отменить запросы на пробуждение, выданные для

  других процессов в той же самой группе, но  имеющих  другой

  UIC, требуется привилегия GROUP;

       2) чтобы отменить запросы на пробуждение, выданные для

  любого процесса в операционной системе  МОС  ВП,  требуется

  привилегия WORLD.

       Отмененные запросы на пробуждение восстанавливают при-

  надлежащую процессу квоту "предел-AST" (ASTLM).

       Если аргументы PIDADR и PRCNAM не заданы, то отменяют-

  ся запросы на  запланированное  пробуждение,  принадлежащие

  вызывающему процессу.

       При завершении образа автоматически отменяются ожидаю-

  щие разрешения запросы на пробуждение, которые выдал  теку-

  щий образ.



                           - 502 -

                        00152-01 97 06


       Эта служебная программа отменяет только те запросы  на

  пробуждение, которые планируются на какое-то время. Она  не

  отменяет запросы на пробуждение, сделанные при помощи  слу-

  жебной программы $WAKE.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_ACCVIO          вызывающая программа не может про-

                           читать строку имени  процесса  или

                           дескриптор строки,  или  не  может

                           записать идентификатор процесса;

       SS$_IVLOGNAM        - строка  имени   процесса   имеет

                           нулевую длину или длину  более  15

                           символов;

       SS$_NONEXPR         - предупреждение.  Указанный  про-

                           цесс  не  существует,  либо  задан

                           неверный идентификатор процесса;

       SS$_NOPRIV          - процесс  не  имеет   привилегии,

                           необходимой для отмены запросов на

                           пробуждение для указанного процес-

                           са.



       13.17. $CHANGE_ACL    -    изменить     список

              управления доступом


       Служебная программа $CHANGE_ACL создает или  модифици-

  рует список управления доступом к об'екту.

       Формат:




                           - 503 -

                        00152-01 97 06


        SYS$CHANGE_ACL     [CHAN],OBJTYP,[OBJNAM],ITMLST,

                           [ACMODE],[NULLARG],[CONTXT]


       Аргументы:

        CHAN (канал)

        Использование в МОС ВП: CHANNEL

        Тип:                    слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Номер канала ввода-вывода, назначенного  об'екту,  для

  которого модифицируется список ACL при выполнении программы

  $CHANGE_ACL.  Аргумент  CHAN  является  словом,  содержащим

  номер канала. Если указан аргумент OBJNAM, то аргумент CHAN

  следует опустить или задать равным нулю.

        OBJTYP (тип об'екта)

        Использование в МОС ВП: LONGWORD_UNSIGNеD

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по ссылке

       Тип об'екта, для которого программа $CHANGE_ACL  моди-

  фицирует список ACL. Аргумент OBJTYP является адресом длин-

  ного  слова,  содержащего  величину,  которая   индицирует,

  является ли об'ект файлом или устройством. В системной мак-

  робиблиотеке ($ACLDEF) определены  следующие  символические

  имена:

       1) ACL$C_DEVICE - об'ект есть устройство;

       2) ACL$C_FILE - об'ект есть файл с файловой структурой

  уровня 2;



                           - 504 -

                        00152-01 97 06


       3) ACL$C_GROUP_GLOBAL_SECTION - об'ект есть глобальная

  секция группы;

       4) ACL$C_LOGICAL_NAME_SECTION -  об'ект  есть  таблица

  логических имен;

       5) ACL$C_SYSTEM_GLOBAL_SECTION - об'ект есть  глобаль-

  ная секция системы.

        OBJNAM (имя об'екта)

        Использование в МОС ВП: CHAR_STRING

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Имя об'екта, для которого программа $CHANGE_ACL  моди-

  фицирует список ACL. Аргумент OBJNAM является адресом деск-

  риптора, указывающего  символьную  строку,  содержащую  имя

  об'екта. Максимальная длина этого  имени  зависит  от  типа

  об'екта.

        ITMLST (список элементов)

        Использование в МОС ВП: ITEM_LIST_3

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по ссылке

       Модификации,  которые   должна   выполнить   программа

  $CHANGE_ACL над списком ACL. Аргумент ITMLST является адре-

  сом структуры данных переменной длины,  которая  определяет

  необходимые модификации.  Структура  данных  имеет  формат,

  представленный на рис. 49.




                           - 505 -

                        00152-01 97 06



               Список элементов

        +-------------------------------+
        !  Код       ! Длина буфера     !
        +-------------------------------+
        !         Адрес буфера          !
        +-------------------------------+
        !        Не используеся         !
        +-------------------------------+

                            Рис. 49


       Список элементов должен заканчиваться длинным  словом,

  содержащим нулевое значение. Структура  данных  состоит  из

  трех элементов для каждого кода элемента:

       1) длина буфера - слово,  содержащее  число  байтов  в

  буфере, на который указывает поле "адрес буфера";

       2) код - слово, содержащее код элемента;

       3) адрес буфера  -  длинное  слово,  содержащее  адрес

  буфера  для  информации,   которая   передается   программе

  $CHANGE_ACL или из нее.

       Следующие символические имена для кодов элементов опе-

  рации определены в системной макробиблиотеке ($ACLDEF):

       ACL$C_ACLLENGTH -   возвращает размер в байтах  списка

                           ACL об'екта. Поле  "адрес  буфера"

                           указывает на длинное слово, содер-

                           жащее этот размер;

       ACL$C_ADDACLENT -   добавляет  элемент  ACЕ  в  начало

                           списка ACL, если  аргумент  CONTXT

                           равен 0, в конец списка ACL,  если

                           аргумент CONTXT равен -1, или в то

                           место списка ACL, на которое  ука-




                           - 506 -

                        00152-01 97 06


                           зывает       предыдущий        код

                           ACL$C_FNDACETYP                или

                           ACL$C_FNDACLENT. Поле "адрес буфе-

                           ра" указывает на структуру  данных

                           переменной    длины,    содержащую

                           добавляемый элемент ACE. С помощью

                           кода ACL$C_ADDACLENT  можно  доба-

                           вить более  одного  элемента  ACE,

                           однако при этом поле "длина  буфе-

                           ра" должно содержать общий  размер

                           всех  добавляемых  элементов  ACE,

                           содержащихся в буфере;

       ACL$C_DELACLENT -   удаляет элемент  ACE,  на  который

                           указывает поле "адрес буфера" или,

                           если это поле равно нулю, то  эле-

                           мент  ACE,  на  который  указывают

                           предыдущие  коды   ACL$C_FNDACETYP

                           или ACL$C_FNDACLENT;

       ACL$C_DELETEACL -   удаляет весь список ACL за  исклю-

                           чением защищенных элементов ACE;

       ACL$C_FNDACETYP -   определяет местоположение элемента

                           ACE, на который  указывает  "адрес

                           буфера";

       ACL$C_FNDACLENT -   определяет местоположение элемента

                           ACE того типа, на  который  указы-

                           вает "адрес буфера";

       ACL$C_RLOCK_ACL -   получает блокировку чтения  об'ек-




                           - 507 -

                        00152-01 97 06


                           та, чтобы заблокировать  запись  в

                           список ACL об'екта  независимо  от

                           режима вызывающей программы.  Бло-

                           кировки списка ACL являются блоки-

                           ровками режима  пользователя,  так

                           что все режимы доступа будут  кор-

                           ректно блокировать списки ACL;

       ACL$C_WLOCK_ACL -   получает исключительную блокировку

                           ACL об'екта. В этом случае  отвер-

                           гаются  попытки  чтения  и  записи

                           всех  остальных  процессов  списка

                           ACL об'екта независимо  от  режима

                           вызывающей  программы.  Блокировки

                           списка ACL  являются  блокировками

                           режима пользователя, так  что  все

                           режимы  доступа  будут   корректно

                           блокировать списки ACL;

       ACL$C_MODACLENT -   заменяет элемент ACE,  на  который

                           указывает поле  "адрес  буфера"  в

                           предыдущих  кодах  ACL$C_FNDACLENT

                           или ACL$C_FNDACETYP;

       ACL$C_READACE       считывает элемент  ACE,  указанный

                           кодом     ACL$C_FNDACETYP      или

                           ACL$C_FNDACLENT в буфер,  заданный

                           в поле "адрес буфера";

       ACL$C_READACL -     читает   ACL   об'екта.   Аргумент

                           CONTXT должен быть равен 0;




                           - 508 -

                        00152-01 97 06


       ACL$C_UNLOCK_ACL -  освобождает от  блокировки,  полу-

                           ченной с  помощью  ACL$C_RLOCK_ACL

                           или ACL$C_WLOCK_ACL.

       При добавлении элемента ACE кодом ACL$C_ADDACLENT  или

  определении    местоположения    элемента     ACE     кодом

  ACL$C_FNDACETYP или ACL$C_FNDACLENT  программа  $CHANGE_ACL

  просматривает список ACL в поисках элемента, соответсвующе-

  го элементу в буфере ACE. Программа $CHANGE_ACL  не  всегда

  находит соответствие, основываясь на содержимом всего буфе-

  ра ACE. То, как программа находит соответствие, определяет-

  ся типом элемента ACE:

       1) элементы ACE  защиты  по  умолчанию  (ACE$C_DIRDEF)

  сопоставляются только по полю типа (ACE$B_TYPE).  Поскольку

  список ACL может иметь только один элемент  ACE  защиты  по

  умолчанию, то программа  $CHANGE_ACL  прекращает  просмотр,

  как только обнаружит соответствие типов;

       2) элемент ACE идентификатора (ACE$C_KEYID)  сопостав-

  ляется  по  полям  флагов  (ACE$W_FLAGS)  и  идентификатора

  (ACE$L_KEY);

       3) сигнальный элемент ACE (ACE$C_ALARM) сопоставляется

  по   полям   флагов   (ACE$W_FLAGS)   и    маски    доступа

  (ACE$L_ACCESS);

       4) все остальные типы элементов  ACE  сравниваются  по

  полному содержанию буфера.

       Поскольку программа $CHANGE_ACL использует эти правила

  соотвествия, добавление элемента ACE может привести к заме-

  не другого элемента ACE. Например, если добавляется элемент




                           - 509 -

                        00152-01 97 06


  ACE идентификатора с теми же полями флагов и  идентификато-

  ра, но с другой маской доступа, то новый элемент ACE  заме-

  нит старый. Если добавляется элемент ACE  в  начало  списка

  ACL, то программа $CHANGE_ACL удаляет любой соответствующий

  элемент ACE, поскольку он никогда  не  будет  найден.  Если

  добавляемый элемент ACE ниже соответсвующего ему элемента в

  списке ACL, то добавляемый элемент ACE  не  имеет  никакого

  влияния, поскольку он никогда не будет найден.

        ACMODE (режим доступа)

        Использование в МОС ВП: ACCESS_MODE

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по ссылке

       Режим доступа, который должен использоваться при конт-

  роле защиты доступа к файлу. Аргумент ACMODE является адре-

  сом длинного слова, содержащего режим доступа. Значением по

  умолчанию для аргумента ACMODE является режим ядра,  однако

  операционная  система  МОС  ВП  сравнивает  режим  доступа,

  заданный аргументом ACMODE с  режимом  доступа  вызывающего

  процесса и использует наименее привилегированный из них.

        NULLARG

        Использование в МОС ВП: NULL_ARG

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Аргумент, занимающий место. Этот аргумент  не  исполь-

  зуется.




                           - 510 -

                        00152-01 97 06


        CONTXT (контекст)

        Использование в МОС ВП: CONTEXT

        Тип:                    длинное слово (без знака)

        Доступ:                 модификация

        Механизм:               по ссылке

       Значение контекста, которое указывает на элемент  ACE.

  Аргумент CONTXT является адресом длинного слова, содержаще-

  го значение контекста.


       Описание.

       Служебная программа $CHANGE_ACL создает и модифицирует

  список ACL об'екта.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - нормальное завершение;

       SS$_ACCVIO          - вызывающий процесс не может про-

                           читать строку  или  ее  дескриптор

                           или дескриптор буфера,  или  вызы-

                           вающий процесс не может записать в

                           буфер, или буфер слишком мал, что-

                           бы разместить элемент ACE;

       SS$_BADPARAM        - задан неверный тип об'екта,  код

                           атрибута,  размер   элемента   или

                           режим доступа.

       SS$_INSFARG         - не указан аргумент  OBJTYP,  или

                           не указаны оба  аргумента  CHAN  и

                           OBJNAM;

       SS$_IVACL           - неверный формат элемента  списка




                           - 511 -

                        00152-01 97 06


                           управления доступом (ACL).



       13.18. $CHKPRO - проверить защиту доступа


       Программа системного обслуживания $CHKPRO  определяет,

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

  определенными правами и  привилегиями,  получить  доступ  к

  об'екту с заданными атрибутами.

       Формат:

       SYS$CHKPRO IMTLST


       Аргументы:

        ITMLST

        Использование в МОС ВП: ITEM_LIST_3

        Тип:                    длинное слово (без занка)

        Доступ:                 только чтение

        Механизм:               по ссылке

       Атрибуты защиты об'екта и права и привилегии процесса,

  пытающегося получить доступ к этому об'екту. Данные атрибу-

  ты используются программой $CHKPRO для проверки,  может  ли

  данный процесс получить доступ к об'екту.  Аргумент  IMTLST

  является адресом  списка  дескрипторов  элементов,  которые

  используются для спецификации атрибутов  защиты  об'екта  и

  прав и привилегий процесса, пытающегося получить  доступ  к

  этому об'екту.

       Структура дескриптора показана на рис. 50, а весь спи-

  сок завершается длинным словом, содержащим нулевое значение

  (CHP$_END).




                           - 512 -

                        00152-01 97 06



             Дескриптор атрибутов

       31            15               0
        +-----------------------------+
        !    Код     ! Длина буфера   !
        +-----------------------------+
        !         Адрес буфера        !
        +-----------------------------+
        !   Адрес возвращаемой длины  !
        +-----------------------------+

                            Рис. 50


       Для каждого кода элемента задается четыре элемента:

       1) длина буфера - слово,  содержащее  число  байтов  в

  буфере, на который указывает поле "адрес буфера";

       2) код - слово, содержащее код элемента. Коды  элемен-

  тов определены в системной макробиблиотеке;

       3) адрес буфера  -  длинное  слово,  содержащее  адрес

  буфера, который используется для передачи информации  прог-

  рамме SYS$CHKPRO или получения информации от  данной  прог-

  раммы;

       4) адрес возвращаемой длины - длинное слово,  содержа-

  щее адрес  буфера  длиной  в  слово,  в  который  программа

  SYS$CHKPRO пишет число байтов, записанных в буфер, адресуе-

  мый полем "адрес  буфера".  Если  буфер,  адресуемый  полем

  "адрес буфера" используется для передачи  информации  прог-

  рамме SYS$CHKPRO, то поле "адрес возвращаемой длины"  игно-

  рируется, но должно быть включено в структуру.

       Все элементы  являются  необязательными.  Спецификация

  какого-то конкретного атрибута защиты приводит к тому,  что

  выполняется контроль защиты  по  этому  атрибуту.  Если  же

  какой-то атрибут защиты требует каких-то прав и привилегий,



                           - 513 -

                        00152-01 97 06


  не заданных в списке элементов,  то  используются  права  и

  привилегии вызывающего процесса.

       В табл. 48 представлен список кодов элементов, опреде-

  ляющих права и привилегии процесса, претендующего на доступ

  к об'екту. В табл. 49 представлен список  кодов  элементов,

  определяющих атрибуты защиты об'екта. В табл. 50  представ-

  лен список кодов элементов, позволяющих  определить,  какие

  права и привилегии были использованы для доступа к об'екту.

  Коды  элементов  определены  в  системной   макробиблиотеке

  ($CHPDEF).

                                                   Таблица 48

  -----------------------------------------------------------

  Элементный     !   Тип    !    Описание

    код          !  данных  !

  -----------------------------------------------------------

  CHP$_ACCESS    ! Длинное  ! Битовая маска, представляющая

                 !  слово   ! желаемый тип доступа ($ARMDEF)

  CHP$_ACMODE    !  Байт    ! Режим доступа процесса, пытаю-

                 !          ! щегося получить доступ к об'ек-

                 !          ! ту

  CHP$_ADDRIGHTS !  Вектор  ! Сегмент списка дополнительных

                 !          ! прав, который надо добавить к

                 !          ! существующему списку прав

  CHP$_FLAGS     ! Длинное  ! Доступ к об'екту претендующего

                 !  слово   ! процесса

  CHP$_PRIV      ! Квадро-  ! Маска привилегий претендующего

                 ! слово    ! процесса




                           - 514 -

                        00152-01 97 06


                                         Продолжение табл. 48

  -----------------------------------------------------------

  Элементный     !   Тип    !    Описание

    код          !  данных  !

  -----------------------------------------------------------

  CHP$_RIGHTS    !  Вектор  ! Список прав претендующего про-

                 !          ! цесса

       Служебная программа $CHKPRO не интерпретирует  биты  в

  маске доступа, вместо этого  она  сравнивает  их  с  маской

  защиты об'екта (CHP$_PROT). Любые биты, не заданные в маске

  CHP$_ACCESS или CHP$_PROT, предполагаются равными нулю, что

  разрешает доступ.

       Режимы доступа и их символические имена  определены  в

  системной макробиблиотеке ($PSLDEF) следующим образом:

       1) PSL$C_KERNEL - режим ядра;

       2) PSL$C_EXEC - режим управления;

       3) PSL$C_SUPER - супервизорный режим;

       4) PSL$C_USER - пользовательский режим.

       Каждый элемент списка прав является структурой  данных

  размером в квадрослово, которая состоит из длинного  слова,

  содержащего значение идентификатора, и  следующего  за  ним

  другого длинного слова, содержащего маску атрибутов  держа-

  теля. Программа SYS$CHKPRO игнорирует атрибуты.

       Допускается  максимум  11  дескрипторов   прав.   Если

  задается код CHP$_ADDRIGHTS и не задан код CHP$_RIGHTS,  то

  список прав процесса, претендующего на  доступ  к  об'екту,

  состоит из списка прав, заданного кодом элемента (или кода-




                           - 515 -

                        00152-01 97 06


  ми) CHP$_ADDRIGHTS, и списка прав самого процесса.

       Если задаются оба кода  CHP$_RIGHTS  и  CHP$_ADDRIGHTS

  то:

       1) код CHP$_RIGHTS должен следовать первым;

       2) идентификатор UIC процесса, претендующего на доступ

  к об'екту,  является  идентификатором  первого  элемента  в

  списке прав, заданном кодом элемента CHP$_RIGHTS;

       3) список прав процесса,  претендующего  на  доступ  к

  об'екту, состоит из списка прав, заданного  кодом  элемента

  CHP$_RIGHTS и кодом элемента CHP$_ADDRIGHTS.

       Символические значения  являются  смещениями  в  битах

  внутри длинного слова, определяемого кодом CNP$_FLAGS.  Эти

  значения можно также получить в виде масок с установленными

  соответствующими битами, если вместо префикса CHP$V исполь-

  зовать  префикс  CHP$M.  Следующие  символические  значения

  определены только в системной макробиблиотеке ($CHPDEF):

       1) CHP$V_READ - выполняется доступ с чтением;

       2) CHP$V_WRITE - выполняется доступ с записью;

       3) CHP$V_USEREADALL - процесс должен иметь  привилегию

  READALL.

       Поскольку маска доступа (CHP$_ACCESS)  не  интерпрети-

  руется программой $CHKPRO, то для определения  того,  может

  ли процесс иметь доступ к об'екту с  чтением  или  записью,

  используется код CHP$_FLAGS.

       Чтобы сформировать символические  имена  для  битов  в

  маске привилегий, необходимо к  имени  привилегии  добавить

  префикс PRIV$V_. Например,  бит,  связанный  с  привилегией




                           - 516 -

                        00152-01 97 06


  BYPASS, имеет имя PRIV$V_BYPASS. Символические имена приви-

  легий определены в системной макробиблиотеке ($PRVDEF).

       Идентификатор UIC процесса, пытающегося получить  дос-

  туп к об'екту, является  первым  идентификатором  в  списке

  прав. Список прав данного процесса состоит из  списка  прав

  заданного кодом CHP$_RIGHTS и (необязательно) списка  прав,

  заданного кодом CHP$_ADDRIGHTS.



                                                   Таблица 49

  -----------------------------------------------------------

  Элементный !  Тип   !     Описание

    код      ! данных !

  -----------------------------------------------------------

  CHP$_ACL   ! Вектор ! Список управления доступом к об'екту

  CHP$_MODE  ! Байт   ! Режим доступа владельца об'екта

  CHP$_MODES ! Квадро-! Защита режима доступа к об'екту

             ! слово  !

  CHP$_OWNER ! Длинное! Идентификатор UIC владельца об'екта

             ! слово  !

  CHP$_PROT  ! Вектор ! Маска защиты "SOGW" об'екта


       Поле "адрес буфера" (см.  рис.  50)  указывает  буфер,

  содержащий один или более  элементов  ACE.  Число,  которое

  задает длину буфера CHP$_ACL (поле "длина  буфера")  должно

  быть равно сумме длин всех ACE. Формат структуры ACE  зави-

  сит от значения второго байта в структуре,  которое  задает

  тип  ACE.  В  описании  программы  системного  обслуживания

  SYS$FORMAT_ACL приведены все типы ACE и их форматы.



                           - 517 -

                        00152-01 97 06


       Элемент CHP$_ACL можно задать несколько раз,  указывая

  тем самым несколько сегментов списка  управления  доступом.

  Можно указать максимум 20 сегментов. Сегменты обрабатывают-

  ся в том порядке, в котором они заданы.

       Режимы доступа владельца об'екта  и  их  символические

  имена определены в системной макробиблиотеке ($PSLDEF) сле-

  дующим образом:

       1) PSL$C_KERNEL - режим ядра;

       2) PSL$C_EXEC - режим управления;

       3) PSL$C_SUPER - супервизорный режим;

       4) PSL$C_USER - пользовательский режим.

       Для каждого возможного типа доступа указывается  двух-

  битовый режим доступа как показано для элемента  CHP$_MODE.

  На рис. 51 приведен формат вектора режимов доступа.


            Формат векторов режима доступа


  31                     10  9  8  7  6  5  4  3  2  1  0
  +-----------------------------------------------------+
  !    !    !    !    !   !  C  !  D  !  E  !  W  !  R  !
  +-----------------------------------------------------+
  !    !    !    !    !   !     !     !     !     !     !
  +-----------------------------------------------------+
  63                                                   32

                            Рис. 51


       Каждая пара битов в векторе режимов доступа  представ-

  ляет режим доступа для каждого  конкретного  типа  доступа.

  Например, биты <6 : 7> представляют значение режима  досту-

  па, которое используется для контроля доступа с удалением.

       На рис. 52 показан формат описания защиты об'екта.





                           - 518 -

                        00152-01 97 06



          Формат описания защиты об'екта

  15          11       7          3         0  Биты
  +-----------------------------------------+  доступа
  !     Все   ! Группа ! Владелец ! Система !  0 - 3
  +-----------------------------------------+
  !    !      !    !   !    !     !    !    !  4 - 7
  +-----------------------------------------+
  !    !      !    !   !    !     !    !    !  8 - 11
  +-----------------------------------------+
  !    !      !    !   !    !     !    !    !  12 - 15
  +-----------------------------------------+
  !    P  P P  !    !     !    !    !  16 - 19
  +-----------------------------------------+
  !    !      !    !   !    !     !    !    !  20 - 23
  +-----------------------------------------+
  !    !      !    !   !    !     !    !    !  24 - 27
  +-----------------------------------------+
  !    !      !    !   !    !     !    !    !  28 - 31
  !    V      !    V   !    V     !    V    !
  +-----------------------------------------+

                            Рис. 52


       Первое слово содержит первые четыре  бита  защиты  для

  каждого поля, второе слово - следующие четыре бита защиты и

  т.д. Если бит равен нулю, то доступ разрешен. По  принятому

  соглашению первые пять битов защиты (справа налево в каждом

  поле первого слова) представляют доступ с чтением, записью,

  выполнением, удалением и (в младшем бите каждого поля  вто-

  рого слова) модификацией. Элемент CHP$_PROT можно  задавать

  в виде приращений слов. Если предоставлен  короткий  буфер,

  для остатка предполагаются нулевые значения.

       Программа $CHKPRO сравнивает четыре младших бита  эле-

  мента CHP$_ACCESS с одним из четырех-битовых полей в  млад-

  шем  слове  элемента  CHP$_PROT.  Следующие   четыре   бита

  CHP$_ACCESS с одним из четырех-битовых  полей  в  следующем

  слове элемента CHP$_PROT и т.д. Программа $CHKPRO  выбирает




                           - 519 -

                        00152-01 97 06


  поле из элемента  CHP$_PROT,  основываясь  на  привилегиях,

  заданных для процесса, пытающегося получить доступ к об'ек-

  ту  (CHP$_PRIV),  и  идентификаторах  UIC  этого   процесса

  (CHP$_RIGHTS  и/или  CHP$_ADDRIGHTS)  и  владельца  об'екта

  (CHP$_OWNER).



                                                   Таблица 50

  -----------------------------------------------------------

  Элементный код !  Тип   !   Описание

                 ! данных !

  -----------------------------------------------------------

  CHP$_ALARMNAME ! Строка ! Строка символов, содержащая

                 !        ! сигнальную запись

  CHP$_MATCHEDACE! Блок   ! Содержит элемент ACE из списка

                 !        ! ACL об'екта, который разрешает

                 !        ! претендующему процессу получить

                 !        ! доступ к об'екту

  CHP$_PRIVUSED  ! Длинное! Маска флагов, представляющая при-

                 ! слово  ! вилегии, используемые для получе-

                 !        ! ния доступа к об'екту


       Если об'ект не имеет возможности выдавать сигнализацию

  о нарушении защиты, то программа  SYS$CHKPRO  возвращает  в

  поле "адрес возвращаемой длины" нулевое значение.

       В качестве смещения в битах внутри длинного слова эле-

  ментного кода CHP$_PRIVUSED используются следующие символи-

  ческие значения:





                           - 520 -

                        00152-01 97 06


       1) CHP$_SYSPRV - для получения нужного доступа исполь-

  зуется привилегия SYSPRV;

       2) CHP$_GRPPRV - для получения нужного доступа исполь-

  зуется привилегия GRPPRV;

       3) CHP$_BYPASS - для получения нужного доступа исполь-

  зуется привилегия BYPASS;

       4)  CHP$_READALL  -  для  получения  нужного   доступа

  используется привилегия READALL.


       Описание.

       Служебная программа $CHKPRO вызывает  контроль  защиты

  доступа, давая возможность иерархическим и другим подсисте-

  мам строить такие защищенные структуры, чья система  защиты

  совместима со средствами  защиты,  предоставленными  опера-

  ционной системой МОС ВП. Это позволяет  также  привилегиро-

  ванной подсистеме выполнять контроль защиты по требованию.

       Если процесс может получить доступ к об'екту, то прог-

  рамма SYS$CHKPRO возвращает  код  состояния  SS$_NORMAL,  в

  противном  случае  программа  SYS$CHKPRO   возвращает   код

  SS$_NOPRIV.

       Данная служебная программа принимает аргументы,  кото-

  рые задают защиту об'екта, к которому  осуществляется  дос-

  туп, права и привилегии процесса, пытающегося получить дос-

  туп к этому об'екту, и тип нужного доступа. Из-за  большого

  разнообразия средств защиты операционной  системы  МОС  ВП,

  аргументы связаны в список элементов.

       Если для другого процесса необходимо вызвать  контроль

  защиты,  то  почти  всегда  необходима   маска   привилегий



                           - 521 -

                        00152-01 97 06


  (CHP$_PRIV) поскольку она используется для всех типов конт-

  роля защиты.

       Если должна записываться сигнальная запись,  то  прог-

  рамма возвращает строку с именем сигнала. Если в дескрипто-

  ре элемента возвращается ненулевая  длина  строки,  то  это

  означает наличие запроса на сигнал.  Нулевая  длина  строки

  свидетельствует об отсутствии такого запроса. Сигналы могут

  запрашиваться  независимо  от  успешного  или   неуспешного

  выполнения контроля защиты.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение. Запрашивае-

                           мый доступ обеспечен;

       SS$_NOPRIV          - служебная программа завершилась.

                           Запрашиваемый доступ не обеспечен;

       SS$_ACCVIO          - вызывающая  программа  не  может

                           прочитать  список  элементов,   не

                           может записать в один  из  буферов

                           определенный в списке элементов;

       SS$_BADPARAM        - недействительный аргумент;

       SS$_IVACL           - элемент    CHP$_ACL    определил

                           недействительный  сегмент   списка

                           ACL.



       13.19. $CLREF - сбросить флаг события


       Служебная программа $CLREF сбрасывает флаг события в в

  кластере локальных или общих флагов событий.




                           - 522 -

                        00152-01 97 06


       Формат:

       SYS$CLREF EFN


       Аргумент:

        EFN (номер флага события)

        Использование в МОС ВП: EF_NUMBER

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Номер флага  события,  который  должен  быть  сброшен.

  Аргумент EFN является длинным словом, которое содержит этот

  номер.


       Возвращаемые значения кода состояния:

       SS$_WASCLR          - успешное  завершение.   Заданный

                           флаг события ранее уже  был  сбро-

                           шен;

       SS$_WASSET          - успешное  завершение.   Заданный

                           флаг события ранее был установлен;

       SS$_ILEFN           - задан недопустимый  номер  флага

                           события;

       SS$_UNASEFC         - процесс не свянан  с  кластером,

                           содержащим указанный флаг.



       13.20. $CMEXEC  -  изменить  режим  на   режим

              управления


       Служебная  прогрмма  $CMEXEC  изменяет  режим  доступа

  вызывающего процесса на режим управления. Данная  программа



                           - 523 -

                        00152-01 97 06


  позволяет процессу изменить свой  режим  доступа  на  режим

  управления, выполнить указанную процедуру, а затем вернуть-

  ся к прежнему режиму доступа, который процесс имел до вызо-

  ва служебной программы.


       Формат:

       SYS$CMEXEC ROUTIN,[ARGLST]


       Аргументы:

        ROUTIN (процерура)

        Использование в МОС ВП: PROCEDURE

        Тип:                    маска входа в процедуру

        Доступ:                 вызов без развертывания

                                стека

        Механизм:               по ссылке

       Процедура, которая должна  выполняться,  пока  процесс

  находится в режиме  управления.  Аргумент  ROUTIN  является

  адресом точки входа в эту процедуру.

        ARGLST

        Использование в МОС ВП: ARG_LIST

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по ссылке

       Список аргументов, которые должны передаваться  проце-

  дуре, указанной аргументом ROUTIN. Аргумент ARGLST является

  адресом этого списка аргументов.


       Описание.





                           - 524 -

                        00152-01 97 06


       Чтобы вызвать данную служебную программу, процесс дол-

  жен иметь привилегию CMEXEC или CMKRNL, или  выполняться  в

  режиме управления или режиме ядра.

       Служебная  программа  $CMEXEC  использует  стандартные

  соглашения о вызове процедур для передачи  управления  ука-

  занной процедуре. Если список аргументов не задан, то  ука-

  затель аргументов (AP) содержит 0, если он не модифицирует-

  ся вызывающим процессом. Однако для  соблюдения  стандартов

  операционной системы МОС ВП на вызов  процедур  не  следует

  опускать аргумент ARGLST.

       При использовании программы $CMEXEC диспетчер программ

  системного обслуживания модифицирует оба регистра R0  и  R1

  перед входом в указAнную процедуру. Выход из процедуры осу-

  ществляется по инструкции RET, а перед возвратом в  регистр

  R0 помещается значение кода состояния.

       Все  программы  системного  обслуживания,   изменяющие

  режим, предназначены для того, чтобы  разрешить  выполнение

  процедуры в более  привилегированном  режиме  доступа,  чем

  режим вызывающего процесса. Если  программа  $CMEXEC  вызы-

  вается из процесса, выполняющегося в режиме ядра, то проце-

  дура, указанная аргументом  ROUTIN,  выполняется  в  режиме

  ядра, а не управления.


       Возвращаемое значение кода состояния:

       SS$_NOPRIV          - процесс  не  имеет   привилегии,

                           необходимой для  изменения  режима

                           на режим управления;





                           - 525 -

                        00152-01 97 06


       Все другие значения,  которые  возвращает  выполняемая

  процедура.



       13.21. $CMKRNL - изменить режим на режим ядра


       Служебная программа  $CMKRNL  изменяет  режим  доступа

  вызывающего процесса на режим ядра. Данная программа позво-

  ляет процессу изменить его режим  доступа  на  режим  ядра,

  выполнить указанную процедуру и вернуться к прежнему режиму

  доступа, который процесс имел до вызова процедуры.


       Формат:

       SYS$CMKRNL ROUTIN,[ARGLST]


       Аргументы:

        ROUTIN

        Использование в МОС ВП: PROCEDURE

        Тип:                    маска входа в процедуру

        Доступ:                 вызов без развертывания

                                стека

        Механизм:               по ссылке

       Процедура, которая должна  выполняться,  пока  процесс

  находится в режме ядра.

        ARGLST

        Использование в МОС ВП: ARG_LIST

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по ссылке





                           - 526 -

                        00152-01 97 06


       Список аргументов, которые должны передаваться  проце-

  дуре, указанной аргументом ROUTIN. Аргумент ARGLST является

  адресом этого списка аргументов.


       Описание.

       Чтобы  вызвать  служебную  программу,  процесс  должен

  иметь привилегию CMKRLN, или выполняться в режиме  управле-

  ния или ядра.

       Служебная  программа  $CMKRNL  использует  стандартные

  соглашения о вызове процедур для передачи  управления  ука-

  занной процедуре. Если список аргументов не задан, то  ука-

  затель аргументов (AP) содержит 0, при условии, что  он  не

  модифицируется вызывающим процессом. Однако для  соблюдения

  стандартов операционной системы МОС ВП на вызов процедур не

  следует опускать этот аргумент.

       При использовании программы $CMKRNL диспетчер программ

  системного обслуживания модифицирует оба регистра R0  и  R1

  перед входом в указанную процедуру. Выход из процедуры осу-

  ществляется с помощью инструкции RET, а перед  возвратом  в

  регистр R0 помещается значение кода состояния.

       Операционная система МОС ВП  загружает  в  регистр  R4

  адрес блока управления процессом (PCB).


       Возвращаемое значение кода состояния:

       SS$_NOPRIV          - процесс  не  имеет   привилегии,

                           необходимой для  изменения  режима

                           на режим ядра;

       Все другие значения,  которые  возвращает  выполняемая




                           - 527 -

                        00152-01 97 06


  процедура.



       13.22. $CNTREG - уменьшить  область  программы

              или область управления


       Служебная программа $CNTREG удаляет заданное количест-

  во страниц от текущего конца области программы или  области

  управления в виртуальном  адресном  пространстве  процесса.

  Удаленные страницы становятся недоступными, и  обращения  к

  ним приводят к нарушению доступа.


       Формат:

       SYS$CNTREG PAGCNT,[RETADR],[ACMODE],[REGION]


       Аргументы:

        PAGCNT

        Использование в МОС ВП: LONGWORD_UNSIGNED

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Количество страниц, подлежащих  удалению  от  текущего

  конца области программы или  области  управления.  Аргумент

  PAGCNT - длинное слово, задающее это количество.

        RETADR

        Использование в МОС ВП: ADDRESS_RANGE

        Тип:                    длинное слово (без знака)

        Доступ:                 только запись

        Механизм:               по ссылке





                           - 528 -

                        00152-01 97 06


       Начальная и конечная страница удаленной области. Аргу-

  мент RETADR - это адрес массива из двух длинных слов, пред-

  назначенного для получения виртуальных адресов начальной  и

  конечной страниц удаленной области.

        ACMODE

        Использование в МОС ВП: ACCESS_MODE

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Режим доступа владельца  удаляемых  страниц.  Аргумент

  ACMODE - это длинное слово, содержащее режим доступа.  Мак-

  рокоманда $PSLDEF определяет для  четырех  режимов  доступа

  следующие обозначения:

       1) PSL$C_KERNEL - режим ядра;

       2) PSL$C_EXEC - режим управления;

       3) PSL$C_SUPER - супервизорный режим;

       4) PSL$C_USER - пользовательский режим.

       Самым привилегированным режимом доступа, который может

  использоваться, является режим доступа вызывающей  програм-

  мы.

        REGION

        Использование в МОС ВП: LONGWORD_UNSIGNED

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Индикатор, который определяет, какую облать памяти (P0

  или P1) надо уменьшить. Аргумент REGION - это длинное  сло-




                           - 529 -

                        00152-01 97 06


  во, содержащее индикатор. Занчение 0 (принимаемое по  умол-

  чанию) указывает на то,  что  требуется  уменьшить  область

  программы (P0-область), а значение 1 указывает на  то,  что

  требуется уменьшить область управления (P1).


       Описание.

       Если во время удаления страниц  возникает  ошибка,  то

  аргумент RETADR, если он задан, определяет  диапазон  стра-

  ниц, которые были успешно удалены до возникновения  ошибки.

  Если не было удалено ни одной страницы, то оба длинных сло-

  ва в RETADR содержат -1.

       Служебная программа  $CNTREG  может  удалять  страницы

  только от текущего  конца  области  программы  или  области

  управления, принадлежащих процессу. Для удаления произволь-

  ного диапазона страниц из какой-либо  области  используется

  служебная программа $DELTVA.

       Примечание. Не следует использовать программы  систем-

  ного обслуживания $CNTREG или $CRETVA в сочетании с другими

  процедурами, написанными пользователем и процедурами испол-

  нительной библиотеки. Данные программы системного  обслужи-

  вания не обеспечивают средств для сообщения другим програм-

  мам об изменениях в виртуальном адресном пространстве.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_ACCVIO          - вызывающая  программа  не  может

                           записать аргумент RETADR;

       SS$_ILLPAGCNT       - заданное   количество    страниц




                           - 530 -

                        00152-01 97 06


                           меньше 1;

       SS$_PAGOWNVIO       - страница в  указанном  диапазоне

                           принадлежит более  привилегирован-

                           ному режиму доступа.



       13.23. $CRELNM - создать логическое имя


       Служебная программа $CRELNM создает логическое  имя  и

  специфицирует его эквивалентное имя.


       Формат:

        SYS$CRELNM   [ATTR],TABNAM,LOGNAM,[ACMODE],[ITMLST]


       Аргументы:

        ATTR (атрибуты)
  
        Использование в МОС ВП: MASK_LONGWORD

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по ссылке

       Атрибуты, которые должны связываться с логическим име-

  нем. Аргумент ATTR является адресом битовой маски  размером

  в длинное слово, задающей эти атрибуты.

       Каждый бит в длинном слове  соответствует  атрибуту  и

  имеет символическое имя. Эти  символические  имена  опреде-

  ляются с помощью макрокоманды $LNMDEF. Чтобы  задать  атри-

  бут, следует указать его символическое имя  или  установить

  соответствующий бит. Битовая маска размером в длинное слово

  является логическим "или"  всех  указанных  атрибутов.  Все

  неопределенные биты должны быть сброшены.



                           - 531 -

                        00152-01 97 06


       Если этот аргумент не задан, или задан равным  0  (нет

  установленных битов), то с логическим именем не связываются

  никакие атрибуты.

       В следующем списке описываются все атрибуты:

       LNM$M_CONFINE       - если установлен данный  бит,  то

                           логическое имя  не  копируется  из

                           процесса в порожденные им  подпро-

                           цессы.  Подпроцесс   создается   с

                           помощью команды  SPAWN  языка  DCL

                           или программой LIB$SPAWN библиоте-

                           ки исполнительных  программ.  Если

                           логическое имя помещается в табли-

                           цу, принадлежащую процессу,  кото-

                           рая имеет атрибут CONFINE, с  этим

                           логическим  именем   автоматически

                           связывается атрибут  CONFINE.  Это

                           относится только к логическим име-

                           нам, принадлежащим процессу;

       LNM$M_NO_ALIAS      если  установлен  данный  бит,  то

                           логическое имя нельзя  дублировать

                           в  данной  таблице  для   внешнего

                           режима доступа. Если в данной таб-

                           лице уже существует  другое  логи-

                           ческое имя с  тем  же  именем  для

                           внешнего режима  доступа,  то  оно

                           удаляется.






                           - 532 -

                        00152-01 97 06


        TABNAM

        импользование в МОС ВП: LOGICAL_NAME

        тип:                    текстовая строка

        доступ:                 только чтение

        механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Имя таблицы в которой создается логическое имя.  Аргу-

  мент TABNAM является адресом дескриптора, который указывает

  на имя данной таблицы. Данный аргумент обязателен.

       Если тABNAM  не  является  именем  таблицы  логических

  имен, то предполагается, что данное логическое имя, которое

  итеративно транслируется до тех пор,  пока  либо  не  будет

  найдено имя таблицы логических имен, либо не будет выполне-

  но допустимое число трансляций.  Если  логическое  имя,  на

  которое указывает аргумент TABNAM, транслируется  в  список

  таблиц логических имен, то логическое имя вводится в первую

  таблицу в этом списке.

       Для указания системной  таблицы  требуется  привилегия

  SYSNAM или SYSPRV, а для указания  групповой  таблицы  тре-

  буется привилегия GRPNAM или SYSPRV.

        LOGNAM

        Использование в МОС ВП: LOGICAL_NAME

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Имя создаваемого логического  имени.  Аргумент  LOGNAM




                           - 533 -

                        00152-01 97 06


  является адресом дескриптора, который указывает  на  строку

  логического имени. Строка логического имени для имени, соз-

  даваемого в каталоге таблиц процесса  или  системы,  должна

  состоять из алфавитно-цифровых  символов,  знаков  денежной

  единицы и подчеркиваня. Максимальная длина равна 31  симво-

  лу. Максимальная длина строки логического имени,  создавае-

  мого в любой другой таблице, составляет  255  символов  без

  ограничения на типы используемых символов. Данный  аргумент

  обязателен.

        ACMODE (режим доступа)

        Использование в МОС ВП: ACCESS_MODE

        Тип:                    байт (без занка)

        Доступ:                 только чтение

        Механизм:               по ссылке

       Режим доступа, который должен быть связан с логическим

  именем. Аргумент ACMODE  является  адресом  байта,  который

  задает режим доступа.

       Режим доступа, связанный с  логическим  именем  опред-

  леяется "максимизацией" режима доступа вызывающего процесса

  и режима доступа, заданного аргументом  ACMODE,  что  озна-

  чает, что  используется  наименее  привилегированный  режим

  доступа из этих двух режимов. Символические  имена  доступа

  определяются макрокомандой $PSLDEF.

       Нельзя указывать режим доступа более привилегированный

  чем режим доступа таблицы, содержащей логическое имя.

       Однако,  если  вызывающий  процесс  имеет   привилегию

  SYSNAM, тогда задаваемый режим доступа связывается с  логи-




                           - 534 -

                        00152-01 97 06


  ческим именем, независимо  от  режима  доступа  вызывающего

  процесса.

       Если данный аргумент опущен или задан равным 0,  то  с

  логическим именем  связывается  режим  доступа  вызывающего

  процесса.

        ITMLST (список элементов)

        Использование в МОС ВП: ITEM_LIST_3

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по ссылке

       Список  элементов,  описывающий  эквивалентные  имена,

  которые должны определяться для логического имени, и инфор-

  мацию, возвращаемую вызывающему процессу.

       Аргумент ITMLST является адресом  списка  дескрипторов

  элементов, каждый из которых задает информацию  об  эквива-

  лентном имени. Список  дескрипторов  элементов  завершается

  длинным словом, содержащим 0. Данный  аргумент  обязателен.

  На рис. 53 показан формат одного дескриптора.






















                           - 535 -

                        00152-01 97 06



        Дескриптор эквивалентного имени

       31            15               0
        +-----------------------------+
        !    Код     !                !
        !  элемента  ! Длина буфера   !
        +-----------------------------+
        !         Адрес буфера        !
        +-----------------------------+
        !   Адрес возвращаемой длины  !
        +-----------------------------+

                            рис. 53


       Служебная программа $CRELNM имеет следующие поля деск-

  риптора элемента:

       Длина буфера        - слово, указывающее число  байтов

                           в  буфере,  на  который  указывает

                           поле "адрес буфера";

       Код элемента        - слово, содержащее  символический

                           код,  который  описывает  существо

                           информации в буфере или возвращае-

                           мой  в   буфер,   адрес   которого

                           задается полем "адрес буфера";

       Адрес буфера        - длинное слово, содержащее  адрес

                           буфера, который получает или пере-

                           дает информацию;

        адрес возвраща-  - длинное  слово,  содержащее  адрес

        щаемой длины       слова, которое  получает  длину  в

                           байтах  информации,   возвращаемой

                           программой $CRELNM  в буфер, адре-

                           суемый полем "адрес  буфера". Поле

                           "адPес возвращаемой длины" исполь-




                           - 536 -

                        00152-01 97 06


                           зуется только, если задан код эле-

                           мента LNM$_TABLE.  Хотя  для  всех

                           остальных   кодов элементов данное

                           поле игнорируется, оно  тем не ме-

                           нее должно присутствовать в каждом

                           дескрипторе элемента.

       Служебная программа $CRELNM имеет следующие коды  эле-

  ментов:

       1) LNM$_ATTRIBUTES

       Если задан код LNM$_ATTRIBUTES, то поле "адрес буфера"

  дескриптора элемента указывает  битовую  маску  размером  в

  длинное слово, которая задает атрибуты  текущей  трансляции

  для логического имени. Атрибуты текущей трансляции относят-

  ся ко  всем  эквивалентным  строкам,  которые  после  этого

  задаются, пока не  встретится  другой  дескриптор  элемента

  LNM$_ATTRIBUTES. Символические имена этих атрибутов опреде-

  ляются с помощью макрокоманды $LNMDEF. Символические  имена

  и их значения для каждого атрибута следующие:

       LNM$M_CONCEALED     - если установлен данный  атрибут,

                           то  система   управления   данными

                           интерпретирует  эквивалентное  имя

                           как имя устройства или  как  логи-

                           ческое имя с этим атрибутом;

       LNM$M_TERMINAL      - если установлен данный  атрибут,

                           то не выполняется дальнейшая  ите-

                           ративная  трансляция   логического

                           имени над этим эквивалентным  име-




                           - 537 -

                        00152-01 97 06


                           нем;

       2) LNM$_CHAIN

       Если указан код LNM$_CHAIN,  то  поле  "адрес  буфера"

  дескриптора элемента указывает на другой список  элементов,

  который программа $CRELNM должна обрабатывать сразу же пос-

  ле обработки текущего списка элементов.

       Если указан код LNM$_CHAIN, то он должен быть  послед-

  ним кодом элемента в текущем списке элементов;

       3) LNM$_STRING

       Если указан код LNM$_STRING, то  поле  "адрес  буфера"

  дескриптора элемента указывает на буфер, содержащий эквива-

  лентное имя, заданное пользователем для логического  имени.

  Максимальная длина эквивалентной строки равна 255 символам.

       Когда программа $CRELNM встречает дескриптор  элемента

  с кодом элемента LNM$_STRING, она создает  элемент  эквива-

  лентного имени, используя последние заданные  значения  для

  кода LNM$_ATTRIBUTES. Данный элемент  эквивалентного  имени

  включат следующую информацию:

       - имя, заданное кодом LNM$_STRING;

       - следующее доступное значение индекса. Каждому  экви-

         валентому имени назначается уникальное значение от 0

         до 127;

       - атрибуты, заданные последним встретившимся  дескрип-

         тором  элемента  с  кодом  элемента  LNM$_ATTRIBUTES

         (если они присутствуют в списке элементов).

       Таким образом, следует конструировать список элементов

  так, чтобы коды элементов  LNM$_ATTRIBUTES  непосредственно




                           - 538 -

                        00152-01 97 06


  предшествовали кодам элементов LNM$_STRING, к  которым  они

  относятся;

       4) LNM$_TABLE

       Если указан код LNM$_TABLE,  то  поле  "адрес  буфера"

  дескриптора элемента адресует буфер,  в  который  программа

  $CRELNM пишет имя таблицы логических  имен,  куда  вводится

  создаваемое логическое имя. Поле "адрес возвращаемой длины"

  указывает на слово, которое содержит буфер, задающий  длину

  в байтах информации, возвращаемой программой $CRELNM.  Мак-

  симальная длина имени таблицы логических имен составляет 31

  символ.

       Данный код элемента может располагаться в любом  месте

  списка элементов.


       Описание.

       Вызывающий процесс должен обладать следующими  возмож-

  ностями:

       1) доступом с записью в разделяемые таблицы для созда-

  ния в них логических имен;

       2) привилегией SYSNAM для создания логических  имен  с

  режимом доступа управления или ядра;

       3) привилегией GRPNAM или SYSPRV, чтобы  ввести  логи-

  ческое имя в групповую таблицу логических имен;

       4) привилегией SYSNAM или SYSPRV, чтобы  ввести  логи-

  ческое имя в системную таблицу логических имен.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение.  Логическое




                           - 539 -

                        00152-01 97 06


                           имя создано;

       SS$_SUPERSEDE       - успешное завершение.  Логическое

                           имя создано, а ранее  существующее

                           логическое имя  с  тем  же  именем

                           удалено;

       SS$_BUFFEROVF       - успешное  завершение.   В   поле

                           "длина буфера"  элементного  деск-

                           риптора задано недостаточное  зна-

                           чение, так что буфер слишком  мал,

                           чтобы вместить затребованные  дан-

                           ные;

       SS$_ACCVIO          - служебная  программа  не   может

                           найти адрес,  заданный  одним  или

                           более аргументами;

       SS$_BADPARAM        - один или более аргументов  имеют

                           неверные значения, или не  указано

                           либо имя таблицы логических  имен,

                           либо логическое имя;

       SS$_DUPLNAM         - сделана попытка созадть логичес-

                           кое имя с тем же именем, что  и  у

                           существующего  логического  имени,

                           котрое было создано в более приви-

                           легированном  режиме   доступа   с

                           атрибутом LNM$M_NO_ALIAS;

       SS$_EXLNMQUOTA      - для создания  логического  имени

                           квота, связанная с указанной  таб-

                           лицей логических имен, недостаточ-




                           - 540 -

                        00152-01 97 06


                           на;

       SS$_INSFMEM         - для создания  логического  имени

                           не хватает динамической памяти;

       SS$_IVLOGNAM        - аргумент  TABNAM,   LOGNAM   или

                           эквивалентная строка задает  стро-

                           ку, длина которой  не  попадает  в

                           диапазон от  1  до  255  символов;

                           аргумент LOGNAM задает строку, чья

                           длина лежит вне диапазона от 1  до

                           31 символов, которая требуется для

                           создания элемента в каталоге  таб-

                           лиц;

       SS$_IVLOGTAB        - аргумент TABNAM не указывает  на

                           таблицу логических имен;

       SS$_NOLOGTAB        - либо  не  существует   указанной

                           таблицы  логических   имен,   либо

                           трансляция логического  имени  для

                           имени таблицы превысила допустимую

                           глубину в 10 трансляций;

       SS$_NOPRIV          - для создания логического имени у

                           вызывающего  процесса  не  хватает

                           привилегий.



       13.24. $CRELNT -  создать  таблицу  логических

              имен


       Служебная программа $CRELNT создает таблицу логических

  имен, которая может разделяться между  многими  процессами,



                           - 541 -

                        00152-01 97 06


  либо таблицу, принадлежащую одному процессу.

       Формат:

        SYS$CRELNT     [ATTR],[RESNAM],[RESLEN],[QUOTA],

                       [PROMSK],[TABNAM],PARTAB,[ACMODE]


       Аргументы:

        ATTR

        Использование в МОС ВП: MASK_LONGWORD

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по ссылке

       Атрибуты, которые влияют на создание таблицы  логичес-

  ких имен и связываются с вновь создаваемой  таблицей  логи-

  ческих имен. Аргумент ATTR является адресом длинного слова,

  содержащего битовую маску, которая задает эти атрибуты.

       Каждый бит в длинном слове  соответствует  атрибуту  и

  имеет символическое имя. Данные символические имена опреде-

  ляются с помощью макрокоманды $LNMDEF. Чтобы  задать  атри-

  бут, следует указать его символическое имя  или  установить

  соответствующий бит. Битовая маска размером в длинное слово

  является логическим "или"  всех  указанных  атрибутов.  Все

  неопределенные биты должны быть сброшены.

       Если данный аргумент не задан, или задан равным 0 (нет

  установленческим именем не связываются никакие атрибуты.

       В следующем списке описываются все атрибуты:

       LNM$M_CONFINE       - если установлен данный  бит,  то

                           таблица логических имен  не  копи-

                           руется из процесса  в  порожденные



                           - 542 -

                        00152-01 97 06


                           им  подпроцессы.  Подпроцесс  соз-

                           дается  с  помощью  команды  SPAWN

                           языка DCL или программой LIB$SPAWN

                           библиотеки  исполнительных   прог-

                           рамм. Данный атрибут  можно  зада-

                           вать только для таблицы логических

                           имен, принадлежащей процессу;  для

                           разделяемых таблиц он  игнорирует-

                           ся.  Состояние  этого  бита  можно

                           изменить только в том случае, если

                           бит не  установлен  в  порождающей

                           таблице.   Таким   образом,   если

                           порождающая таблица имеет  атрибут

                           LNM$M_CONFINE, то вновь  созданная

                           таблица  будет  также  его  иметь,

                           независимо от того, что указано  в

                           аргументе ATTR. С другой  стороны,

                           если порождающая таблица не  имеет

                           атрибута  LNM$_CONFINE,  то  вновь

                           созданная таблица  может  получить

                           данный  атрибут   через   аргумент

                           ATTR. Каталог таблиц,  принадлежа-

                           щих                      процессу,

                           LNM$PROCESS_DIRECTORY,  не   имеет

                           атрибута LNM$M_CONFINE;

       LNM$M_CREATE_IF     - если установлен данный  бит,  то

                           новая таблица логических имен соз-




                           - 543 -

                        00152-01 97 06


                           дается только в том  случае,  если

                           указаное имя таблицы не  задано  в

                           соответсвующем каталоге  таблиц  с

                           данным режимом доступа. Если такое

                           имя таблицы существует,  то  новая

                           таблица  не  создается  и  никаких

                           модификаций  не  выполняется   над

                           существующим именем таблицы.  Дан-

                           ный принцип верен даже в том  слу-

                           чае, если существующее  имя  имеет

                           другие значения атрибутов или кво-

                           ты, или даже если оно не  является

                           именем таблицы  логисческих  имен.

                           Если бит LNM$M_CREATE_IF не  уста-

                           новлен, то новая таблица  логичес-

                           ких имен заменяет любое существую-

                           щее имя таблицы в  соответствующем

                           каталоге таблиц. Установка данного

                           атрибута полезна, когда  двое  или

                           больше пользователей пытаются соз-

                           дать и использовать одну и  ту  же

                           таблицу и не обеспечивают  синхро-

                           низацию ее создания;

       LNM$M_NO_ALIAS      - если установлен данный  бит,  то

                           имя таблицы логических имен нельзя

                           дублировать  для  внешнего  режима

                           доступа в соответсвующем  каталоге




                           - 544 -

                        00152-01 97 06


                           таблиц.  Если   данное   имя   уже

                           существует  для  внешнего   режима

                           доступа, то оно удаляется.

        RESNAM

        Использование в МОС ВП: LOGICAL_NAME

        Тип:                    текстовая строка

        Доступ:                 только запись

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Имя вновь созданной таблицы логических  имен,  которое

  возвращает  программа  $CRELNT.  Аргумент  RESNAM  является

  адресом дескриптора, указывающего на данное имя. Имя предс-

  тавляет из себя строку символов, максимальная длина которой

  составляет 31 символ.

        RESLEN

        Использование в МОС ВП: WORD_UNSIGNED

        Тип:                    слово (без знака)

        Доступ:                 только запись

        Механизм:               по ссылке

       Длина в байтах имени вновь созданной таблицы  логичес-

  ких имен, котрое  возвращает  программа  $CRELNT.  Аргумент

  RESLEN является адресом слова, в которое записывается  дан-

  ная длина.

        QUOTA (квота)

        Использование в МОС ВП: LONGWORD_UNSIGNED

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

       


                           - 545 -

                        00152-01 97 06


        Mеханизм:               по ссылке

       Максимальное число байтов  памяти,  которая  распреде-

  ляется для логических имен, содержащихся в  данной  таблице

  логических имен. Аргумент QUOTA является  адресом  длинного

  слова, задающего данное значение.

       Если не задано значение квоты, то  таблица  логических

  имен имеет неограниченную квоту. Разделяемая таблица,  соз-

  данная с  неограниченной  квотой,  позволяет  пользователю,

  имеющему доступ с записью в данной таблице, потреблять сис-

  темную динамическую память без ограничения.

        PROMSK

        Использование в МОС ВП: FILE_PROTECTION

        Тип:                    слово (без знака)

        Доступ:                 только чтение

        Механизм:               по ссылке

       Маска защиты, которая связывается со  вновь  созданной

  разделяемой  таблицей  логических  имен.  Аргумент   PROMSK

  является адресом слова, которое содержит  значение,  предс-

  тавляющее четыре 4-битовых поля, где каждое поле  описывает

  тип доступа, разрешенный системе, владельцу, группе и  всем

  (рис. 54).
















                           - 546 -

                        00152-01 97 06



                  Маска защиты

  +--------------------------------------------------------+
  !     все       ! группа    ! владелец    !  система     !
  +---------------!-----------!-------------!--------------+
  ! D ! E ! W ! R !D !E !W !R !D !E ! W ! R !D ! E ! W ! R !
  +--------------------------------------------------------+
  15  14  13  12  11  10 9  8  7  6   5   4  3   2   1   0

                            Рис. 54


       Каждое поле состоит из четырех битов, задающих  защиту

  таблицы логических имен. Бит защиты  "E"  не  используется.

  Остальные биты в маске защиты позволяют произволить следую-

  щие действия:

       1) бит защиты R разрешает доступ к  именам  в  таблице

  логических имен;

       2) бит защиты W разрешает создание и удаление имен  из

  таблицы логических имен;

       3) бит защиты D разрешает удалять  таблицу  логических

  имен.

       Если бит имеет значение 0, то  доступ  разрешен.  Если

  маска не задана, то  системе  и  владельцу  предоставляется

  полный доступ, а группе и всем пользователям  любой  доступ

  запрещен.

        TABNAM (имя таблицы)

        Использование в МОС ВП: LOGICAL_NAME

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины





                           - 547 -

                        00152-01 97 06


       Имя новой таблицы  логических  имен.  Аргумент  TABNAM

  является адресом дескриптора строки символов,  указывающего

  на данную строку имени. Имена таблиц содержатся либо в сис-

  темном каталоге таблиц (LNM$SYSTEM_DIRECTORY), либо в ката-

  логе процесса (LNM$PROCESS_DIRECTORY). Имена таблиц  должны

  состоять из алфавитно-цифровых  символов,  знаков  денежной

  единицы и подчеркивания. Максимальная длина имени равна  31

  символу.

       Если данный аргумент не задан, то используется имя  по

  умолчанию в формате LNM$_XXXX,  где  XXXX  есть  уникальное

  шестнадцатиричное число.

       Для спецификации имени разделяемой таблицы  логических

  имен требуется привилегия SYSPRV.

        PARTAB

        Использование в МОС ВП: CHAR_STRING

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Имя  порождающей  таблицы.  Аргумент  PARTAB  является

  адресом дескриптора строки символов, который  указывает  на

  строку  имени.  Правильными  значениями   этого   аргумента

  являются      только      имена      каталогов       таблиц

  LNM$PROCESS_DIRECTORY или LNM$SYSTEM_DIRECTORY. Чтобы  ука-

  зать имя  каталога  LNM$SYSTEM_DIRECTORY  необходимо  иметь

  привилегию SYSPRV. Данный аргумент обязателен.






                           - 548 -

                        00152-01 97 06


        ACMODE

        Использование в МОС ВП: ACCESS_MODE

        Тип:                    байт (без знака)

        Доступ:                 только чтение

        Механизм:               по ссылке

       Режим доступа, который связывается с вновь создаваемой

  таблицей логических имен. Аргмуент ACMODE является  адресом

  байта,  содержащего  данный  режим  доступа.   Макрокоманда

  $PSLDEF определяет символические имена для четырех  режимов

  доступа.

       Если аргумент ACMODE не указан или задан равным 0,  то

  с новой таблицей логических имен связывается режим  доступа

  вызывающего процесса.

       Режим доступа, связываемый с таблицей логических  имен

  определяется  "максимизацией"  режима  доступа  вызывающего

  процесса и режима доступа,  указанного  аргументом  ACMODE.

  Используется наименее  привилегированный  из  этих  режимов

  доступа.

       Однако,  если  вызывающий  процесс  имеет   привилегию

  SYSNAM, то заданный аргументом ACMODE режим доступа  связы-

  вается с таблицей логических  имен,  независимо  от  режима

  доступа этого процесса.

       Режим доступа, связанный с таблицей  логических  имен,

  управляет обработкой данной таблицы и обеспечивает механизм

  защиты, который предотвращает  удаление  таблиц  логических

  имен внутреннего режима доступа непривилегированными  поль-

  зователями.




                           - 549 -

                        00152-01 97 06


       Нельзя указывать режим доступа  более  привилегирован-

  ный, чем режим доступа порождающей таблицы.

       Таблица логических имен с режимом доступа  супервизора

  может содержать логические имена режима доступа супервизора

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

  таблиц логических имен режимов супервизора и  пользователя,

  но не может содержать логических имен режима управления или

  ядра или быть порождающей для таблиц логических имен режима

  управления или ядра.

       Для указания режима доступа управления  или  ядра  для

  таблицы логических имен требуется привилегия SYSNAM.


       Описание.

       В  зависимости  от  операции  использование  программы

  $CRELNT может потребовать от вызывающего  процесса  наличия

  следующих привилегий:               

       1) привилегия SYSPRV требуется для создания  разделяе-

  мой таблицы;

       2) привилегия SYSNAM требуется для создания  таблиц  с

  более привилегированным режимом доступа чем  у  вызывающего

  процесса.

       Программа  $CRELNT  использует   следующие   системные

  ресурсы:

       1) системная страничная динамическая память  требуется

  для создания разделяемой таблицы логических имен;

       2) динамическиая память процесса требуется для  созда-

  ния таблицы логических имен, принадлежащей процессу.





                           - 550 -

                        00152-01 97 06


       От порождающей таблицы зависит, является ли новая таб-

  лица разделяемой таблицей или таблицей, принадлежащей  про-

  цессу. Если порождающая таблица принадлежит процессу, то  и

  новая таблица принадлежит процессу. Если порождающая табли-

  ца является разделяемой, то и новая таблица является разде-

  ляемой.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное   завершение.   Таблица

                           логических имен уже существует;

       SS$_LNMCREATED      - успешное   завершение.   Таблица

                           логических имен создана;

       SS$_SUPERSEDE       - успешное   завершение.   Таблица

                           логических имен создана и ее логи-

                           ческое имя заменило уже существую-

                           щее логическое имя в каталоге таб-

                           лиц;

       SS$_ACCVIO          - служебная  программа  не   может

                           получить доступ к адресам,  задан-

                           ным одним или более аргументами;

       SS$_BADPARаM        - один или более аргументов  имеют

                           неверное значение  или  не  задана

                           порождающая   таблица   логических

                           имен;

       SS$_DUPLNAM         - сделана попытка создать  таблицу

                           логических имен с  тем  же  именем

                           как уже существующее имя  в  соот-

                           ветсвующем  каталоге   таблиц,   и



                           - 551 -

                        00152-01 97 06


                           существующее имя  было  создано  с

                           более  привилегированным   режимом

                           доступа        с         атрибутом

                           LNM$M_NO_ALIAS;

       SS$_EXLNMQUOTA      - порождающая таблица имеет недос-

                           таточную квоту для создания  новой

                           таблицы;

       SS$_INSFMEM         - для создания таблицы  не  доста-

                           точно динамической памяти;

       SS$_IVLOGNAM        - аргумент PARTAB  задает  строку,

                           чья длина лежит вне диапазона от 1

                           до 31 символа;

       SS$_IVLOGTAB        - аргумент  TABNAM   не   является

                           алфавитно-цифровой   строкой   или

                           задает строку, чья длина лежит вне

                           диапазона от 1 до 31 символа;

       SS$_NOLOGTAB        - не существует порождающей табли-

                           цы логических имен;

       SS$_NOPRIV          - у вызывающего процесса нет необ-

                           ходимой  привилегии  для  создания

                           таблицы;

       SS$_PARENT_DEL      - создание  новой  таблицы   может

                           привести  к  удалению  порождающей

                           таблицы;

       SS$_RESULTOVF       - буфер имени таблицы не достаточ-

                           но велик, чтобы вместить имя новой

                           таблицы.




                           - 552 -

                        00152-01 97 06


       13.25. $CREMBX  -  создать  почтовый  ящик   и

              назначить канал


       Служебная программа $CREMBX создает  виртуальное  уст-

  ройство почтового ящика с именем MBAN, и назначает  к  нему

  канал ввода-вывода. Если почтовый ящик с  указанным  именем

  уже существует, то служебная  программа  $CREMBX  назначает

  канал к существующему почтовому ящику.


       Формат:

        SYS$CREMBX   [PRMFLG],CHAN,[MAXMSG],[BUFQUO],

                     [PROMSK],[ACMODE],[LOGNAM]


       Аргументы:

        PRMFLG

        Использование в МОС ВП: BOOLEAN

        Тип:                    байт (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Индикатор, указывающий, является ли созданный почтовый

  ящик постоянным или  временным.  Аргумент  PRMFLG  является

  байтом, содержащим значение индикатора. Значение  1  задает

  постоянный почтовый ящик, а значение 0, которое принимается

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

  значения считаются ошибочными.

        CHAN (канал)

        Использование в МОС ВП: CHANELL

        Тип:                    слово (без знака)

        Доступ:                 только запись

         

                           - 553 -

                        00152-01 97 06


        Механизм:               по ссылке

       Номер канала, назначенный почтовому  ящику  программой

  $CREMBX. Аргумент CHAN является адресом  слова,  в  которое

  программа $CREMBX записывает номер канала.

        MAXMSG

        Использование в МОС ВП: LONGWORD_UNSIGNED

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению
        
       Максимальный  размер  (в  байтах)  сообщения,  которое

  может быть послано в почтовый ящик.аргумент MAXMSG является

  длинным словом, которое содержит данный размер. Если  аргу-

  мент MAXMSG не указан или задан равным 0,  то  операционная

  система МОС ВП обеспечивает значение по умолчанию.

        BUFQUO

        Использование в МОС ВП: LONGWORD_UNSIGNED

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Число байтов системной  динамической  памяти,  которое

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

  почтовый ящик. Аргумент  BUFQUO  является  длинным  словом,

  которое содержит это число. Если аргумент BUFQUO не  указан

  или задан равным 0, то операционная система МОС ВП  обеспе-

  чивает значение по умолчанию.

       Для временного почтового  ящика  это  значение  должно

  быть меньшим или равным квоте буфера процесса.




                           - 554 -

                        00152-01 97 06


        PROMSK (маска защиты)

        Использование в МОС ВП: FILE_PROTECTION

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Маска защиты, которая связывается с создаваемым почто-

  вым ящиком. Аргумент PROMSK является длинным словом, содер-

  жащим комбинированное значение битов, установленных в маске

  защиты. Нулевые биты разрешают доступ, а установленные биты

  запрещают    доступ    каждому    из    четырех     классов

  пользPелP:Pистема, владелец, группа и все (рис. 55).


                    Маска защиты

  +--------------------------------------------------------+
  !     все       ! группа    ! владелец    !  система     !
  +---------------!-----------!-------------!--------------+
  ! L ! P ! W ! R !L !P !W !R !L !P ! W ! R !L ! P ! W ! R !
  +--------------------------------------------------------+
  15  14  13  12  11  10 9  8  7  6   5   4  3   2   1   0

                            рис. 55


       Если аргумент PROMSK не указан или задан равным 0,  то

  всем пользователям разрешен доступ с чтением (R), с записью

  (W), а также физический (P) и логический (L).

       Бит физического доступа ингорируется для всех  катего-

  рий пользователей.  Бит  логического  доступа  должен  быть

  сброшен для всех категорий пользователей,  поскольку  логи-

  ческий доступ требуется для  чтения  и  записи  в  почтовый

  ящик. Таким образом, если бит логического доступа не  сбро-

  шен, то биты доступа с чтением и записью не имеют смысла.





                           - 555 -

                        00152-01 97 06


       Логический доступ также позволяет пользователю ставить

  в очередь прерывания AST чтения и записи.

        ACMODE (режим доступа)

        Использование в МОС ВП: ACCESS_MODE

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Режим доступа, связанный с каналом, которому  назначен

  почтовый ящик. Аргмуент  ACMODE  является  длинным  словом,

  которое содержит режим доступа.

       Макрокоманда $PSLDEF  определяет  символические  имена

  для четырех режимов доступа.

       Наиболее   привилегированным   используемым    режимом

  является режим доступа вызывающего процесса.

        LOGNAM (логическое имя)

        Использование в МОС ВП: LOGICAL_NAME

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Логическое имя, назначаемое почтовому ящику.  Аргумент

  LOGNAM является адресом дескриптора строки символов, указы-

  вающего на строку логического имени.

       Эквивалентное имя для почтового ящика имеет вид MBAN:.

  Это эквивалентное имя помечается атрибутом "TERMINAL". Про-

  цесс может использовать логическое имя для назначения  поч-

  товому ящику других каналов ввода-вывода.




                           - 556 -

                        00152-01 97 06


       Для постоянных  почтовых  ящиков  служебная  программа

  $CREMBX вводит указанное логическое имя (если оно задано) в

  таблицу логических имен LNM$PERMANENT_MAILBOX, а  для  вре-

  менных  почтовых  ящиков  -  в  таблицу   логических   имен

  LNM$TEMPORARY_MAILBOX.


       Описание.

       В  зависимости  от  операции  использование  программы

  $CREMBX может потребовать от вызывающего процесса следующих

  привилегий:                         

       1) привилегию TMPMBX для создания временного почтового

  ящика;

       2) привилегию PRMMBX для создания постоянного почтово-

  го ящика;

       3) привилегию SHMEM для  создания  почтового  ящика  в

  памяти, разделяемой многими процессорами;

       4) привилегию SYSNAM, чтобы поместить  логическое  имя

  для почтового ящика в системной таблице логических имен;

       5) привилегию GRPNAM, чтобы поместить  логическое  имя

  для почтового ящика в групповую таблицу логических имен.

       Программа  $CREMBX  использует   следующие   системные

  ресурсы:

       1) системная динамическая память требуется для распре-

  деления базы данных для почтового ящика и  для  элемента  в

  таблице логических имен (если логическое имя задано);

       2) при создании временного почтового ящика квота счет-

  чика байтов для ввода-вывода с буферизацией  (BYTLM),  при-

  надлежащая  процессу,  уменьшается  на  величину,  заданную



                           - 557 -

                        00152-01 97 06


  аргументом BUFQUO. Размер блока управления устройством поч-

  тового ящика и логического имени (если  оно  задано)  также

  вычитается из данной квоты. При  удалении  почтового  ящика

  данная квота возвращается процессу;

       3) создание почтового ящика в разделяемой памяти  тре-

  бует квоты MAILBOX PORT. Данная  квота  запрашивается  пос-

  редством команды SHARE при генерации  операционной  системы

  МОС ВП и возвращается после удаления почтового ящика.

       После создания почтового  ящика  создающий  процесс  и

  другие процессы могут  назначить  дополнительные  каналы  к

  данному  почтовому  ящику,  вызывая   служебные   программы

  $ASSIGN или $CREMBX. Если почтовый ящик уже существует,  то

  служебная программа $CREMBX просто назначает канал к данно-

  му почтовому ящику. В таком случае  взаимодействующим  про-

  цессам необходимо заботиться о том,  какой  из  них  должен

  выполняться первым, чтобы создать почтовый ящик. Операцион-

  ная система МОС ВП поддерживает  справочный  счетчик  числа

  каналов,  назначенных  почтовому  ящику.  Значение  данного

  счетчика уменьшается всякий раз, когда канал  освобождается

  либо с помощью  служебной  программы  $DASSGN,  либо  когда

  образ, который назначил канал, завершается.

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

  остается назначенных ему каналов. Постоянный почтовый  ящик

  должен быть явно помечен для удаления служебной  программой

  $DELMBX. Реально он удаляется,  когда  больше  не  остается

  назначенных ему каналов.

       Почтовый ящик  рассматривается  как  разделяемое  уст-




                           - 558 -

                        00152-01 97 06


  ройство, однако его нельзя монтировать или распределять.

       Почтовые ящики назначаются последовательно,  при  этом

  по мере создания номера устройств возрастают от 1 до макси-

  мум 9999. После того, как исчерпаны все  допустимые  номера

  устройств, операционная система МОС  ВП  начинает  опять  с

  номера 1.

       Процесс может  получить  номер  устройства  созданного

  почтового ящика, вызывая служебную программу $GETDVI.

       Значения по умолчанию для максимального размера  сооб-

  щения и квоты буфера (соответствующее кратное размера сооб-

  щения) определяются для  конкретной  системы  во  время  ее

  генерации. Параметр генерации DEFMBXMXMSG определяет  квоту

  буфера.

       При задании логического имени для временного почтового

  ящика служебная программа  $CREMBX  вводит  имя  в  таблицу

  логических имен LNM$TEMPORARY_MAILBOX.

       Обычно данная таблица задается  в  таблице  логических

  имен задания LNM$JOB, поэтому только процессы того же зада-

  ния, которому принадлежит создавший почтовый ящик  процесс,

  могут использовать данное логическое имя для доступа к поч-

  товому ящику. Если желательно использовать временный почто-

  вый ящик для реализации связи между процессами разных зада-

  ний, то необходимо переопределить  LNM$TEMPORARY_MAILBOX  в

  каталоге таблиц логических имен  процесса  ,  чтобы  задать

  таблицу логических имен, к которой  данные  процессы  могут

  иметь доступ.

       Например, если требуется использовать почтовый ящик  в




                           - 559 -

                        00152-01 97 06


  качестве устройства связи для процессов  из  одной  группы,

  необходимо  переопределить   LNM$TEMPORARY_MAILBOX,   чтобы

  задать групповую таблицу логических имен. Следующие команды

  DCL назанчают логические имена временного  почтового  ящика

  групповой таблице логических имен:

  $DEFINE/TABLE=LNM$PROCESS_DIRECTORY-

   LNM$TEMPORARY_MAILBOX LNM$GROUP

       Если указывается логическое имя для постоянного почто-

  вого ящика, то операционная система МОС  ВП  вводит  данное

  имя в таблицу  логических  имен,  заданную  именем  таблицы

  логических имен LNM$PERMANENT_MAILBOX. Обычно данная табли-

  ца задается в системной таблице логических имен LNM$SYSTEM.

  Если необходимо логическое  имя,  указанное  для  почтового

  ящика, ввести в таблицу логических имен отличную от систем-

  ной, то для спецификации нужной таблицы следует переопреде-

  лить LNM$PERMANENT_MAILBOX (см. раздел 6).

       Если  переопределить  имя  LNM$TEMPORARY_MAILBOX   или

  LNM$PERMANENT_MAILBOX, то необходимо обеспечить элемент для

  этого нового имени в таблице логических имен  LNM$FILE_DEV.

  Система управления данными СУД-32  и  программы  системного

  обслуживания используют данную таблицу для трансляции  имен

  устройств ввода-вывода. Если же такой элемент не обеспечен,

  то операционная система  МОС  ВП  не  сможет  транслировать

  логическое имя почтового ящика и, следовательно, не получит

  доступа  к  данному  почтовому  ящику  как   к   устройству

  ввода-вывода.






                           - 560 -

                        00152-01 97 06


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$ACCVIO           - вызывающий процесс не может про-

                           читать  строку  логического  имени

                           или  дескриптор  строки,  или   не

                           может записать номер канала;

       SS$_BADPARAM        - аргмуент BUFQUO задает  значение

                           больше чем  число  65355,  которое

                           получается  вычитанием  из   65535

                           размера блока управления устройст-

                           вом почтового ящика (UCB);

       SS$_EXBYTLM         - процесс  обладает  недостаточной

                           квотой       счетчика       байтов

                           ввода-вывода    с     буферизацией

                           (BYTLM), чтобы  распределить  блок

                           управления  устройтсвом  почтового

                           ящика или чтобы удовлетворить зап-

                           росы на буфер;

       SS$_EXPORTQUOTA     - процесс превысил допустимое чис-

                           ло почтовых ящиков, которые он мог

                           создать по данному входу многовхо-

                           довой (разделяемой) памяти;

       SS$_INSFMEM         - для завершения  служебной  прог-

                           раммы  нет   доступной   системной

                           динамической  памяти  достаточного

                           размера;

       SS$_INTERLOCK       - битовая карта для  распределения




                           - 561 -

                        00152-01 97 06


                           почтовых ящиков из указанной  раз-

                           деляемой памяти заблокирована дру-

                           гим процессом;

       SS$IVLOGNAM         - строка логического  имени  имеет

                           длину 0 или более 255 символов;

       SS$IVSTSFLG         - в  аргументе  PRMFLG  установлен

                           неопределенный бит.  Данный  аргу-

                           мент может иметь значение 1 и 0;

       SS$_NOIOCHAN        - нет каналов ввода-вывода доступ-

                           ных для назначения;

       SS$_NOPRIV          - процесс  не  имеет   привилегии,

                           чтобы создать  временный  почтовый

                           ящик,  постоянный  почтовый  ящик,

                           почтовый ящик в памяти,  разделяе-

                           мой  многими   процессорами,   или

                           логическое имя;

       SS$_NOSHMBLOCK      - в разделяемой памяти нет доступ-

                           ного  блока  управления   почтовым

                           ящиком,  который  можно  было   бы

                           использовать для  создания  нового

                           почтового ящика;

       SS$_OPINCOMPL       - при компановке блока  управления

                           почтовым  ящиком   в   разделяемой

                           памяти встретился идентичный номер

                           устройства;

       SS$_SHMNOTCNCT      - разделяемая память, указанная  в

                           аргументе LOGNAM, неизвестна  опе-




                           - 562 -

                        00152-01 97 06


                           рационной системе МОС  ВП.  Данная

                           ошибка может быть вызвана орфогра-

                           фической ошибкой в строке, неверно

                           назначенным логическим именем, или

                           при генерации  системы  назначение

                           данной разделяемой памяти прошло с

                           ошибкой;

       SS$_TOOMANYLNAM     - трансляция  строки   логического

                           имени,   названной   в   аргументе

                           LOGNAM, превысила разрешенную глу-

                           бину. (число трансляций  превысило

                           допустимую величину).



       13.26. $CREPRC - создать процесс


       Служебная программа  $CREPRC  создает  подпроцесс  или

  отсоединенный процесс для вызывающего процесса.

       Формат:

        SYS$CREPRC  [PIDADR],[IMAGE],[INPUT],[OUTPUT],

                    [ERROR],[PRVADR],[QUOTA],[PRCNAM],

                    [BASPRI],[UIC],[MBXUNT],[STSFLG]


       Аргументы:

        PIDADR

        Использование в МОС ВП: PROCESS_ID

        Тип:                    длинное слово (без знака)

        Доступ:                 только запись

        Механизм:               по ссылке




                           - 563 -

                        00152-01 97 06


       Идентификация вновь созданного процесса  (PID).  Аргу-

  мент PIDADR - это адрес длинного слова, в  которое  $CREPRC

  записывает PID.

        IMAGE

        Использование в МОС ВП: LOGICAL_NAME

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Имя образа, который будет работать во вновь  созданном

  процессе. Аргумент IMAGE - это адрес дескриптора символьной

  строки, указывающего на спецификацию файла образа.

       Имя образа может быть длиной максимум 63 символа. Если

  имя образа - это логическое имя, то  в  таблице  логических

  имен, доступной созданному процессу, должно  присутствовать

  эквивалентное имя.

        INPUT

        Использование в МОС ВП: LOGICAL_NAME

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - десткриптор

                                строки фиксированной длины

       Эквивалентное имя, которое  соответствует  логическому

  имени SYS$INPUT в таблице логических имен создаваемого про-

  цесса. Аргумент INPUT - это  адрес  дескриптора  символьной

  строки, указывающего на строку эквивалентного имени.






                           - 564 -

                        00152-01 97 06


        OUTPUT

        Использование в МОС ВП: LOGICAL_NAME

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Эквивалентное имя, которое  соответствует  логическому

  имени SYS$OUTPUT в  таблице  логических  имен  создаваемого

  процесса. Аргумент OUTPUT - это адрес дескриптора  символь-

  ной строки, указывающего на строку эквивалентного имени.

        ERROR

        Использование в МОС ВП: LOGICAL_NAME

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Эквивалентное имя, которое  соответствует  логическому

  имени SYS$ERROR в таблице логических имен создаваемого про-

  цесса. Аргумент ERROR - это  адрес  дескриптора  символьной

  строки, указывающего на строку эквивалентного имени.  Аргу-

  мент  ERROR  игнорируется,  если  аргумент   IMAGE   задает

  SYS$SYSTEM:LOGINOUT.EXE. В данном  случае  SYS$ERROR  будет

  указывать на SYS$OUTPUT.

        PRVADR

        Использование в МОС ВП: MASK_PRIVILEGES

        Тип:                    квадрослово (без знака)

        Доступ:                 только чтение

        


                           - 565 -

                        00152-01 97 06


        Механизм:               по ссылке

       Привилегии,  которые  даются  создаваемому   процессу.

  Аргумент PRVADR - это адрес вектора размером в квадрослово,

  в котором каждый бит  соответствует  привилегии.  Установка

  какого-либо бита дает определенную привилегию.

       Каждый бит имеет символическое имя. Данные имена опре-

  деляют при помощи макрокоманды $PRVDEF. Вектор  формируется

  путем указания символического имени каждой требуемой приви-

  легии. В табл. 51 даны символические имена и описания  каж-

  дой привилегии.


                                                  Таблица 51

  ----------------------------------------------------------

  Привилегия ! Символическое !  Описание

             !     имя       !

  ----------------------------------------------------------

  ALLSPOLL   ! PRV$V_ALLSPOоL! Назначить устройство, обслу-

             !               ! живающее через спул

  BUGCHK     ! PRV$V_BUGCHK  ! Организовать записи в журнал

             !               ! ошибок внутренней диагности-

             !               ! ческой проверки

  BYPASS     ! PRV$V_BYPASS  ! Обход защиты на основе UIC

  CMEXEC     ! PRV$V_CMEXEC  ! Изменить режим на режим упра-

             !               ! вления

  CMKRNL     ! PRV$V_CMKRNL  ! Изменить режим на режим ядра

  DETACH     ! PRV$V_DETACH  ! Создавать отсоединенные про-

             !               ! цессы




                           - 566 -

                        00152-01 97 06


                                        Продолжение табл. 51

  ----------------------------------------------------------

  Привилегия ! Символическое !  Описание

             !     имя       !

  ----------------------------------------------------------

  DIAGNOSE   ! PRV$V_DIAGNOSE! Можно осуществлять диагнос-

             !               ! тику устройства

  DOWNGRADE  !PRV$V_DOWNGRADE! Можно понижать классификацию

  EXQUOTA    ! PRV$V_EXQUOTA ! Можно превышать квоты

  GROUP      ! PRV$V_GROUP   ! Управлять группой процессов

  GRPNAM     ! PRV$V_GRPNAM  ! Помещать имя в групповую

             !               ! таблицу логических имен

  GRPPRV     ! PRV$V_GRPPRV  ! Осуществлять доступ к группе

             !               ! через поля с системной защи-

             !               ! той

  LOG_IO     ! PRV$V_LOG_IO  ! Выполнять операции логическо-

             !               ! го ввода-вывода

  MOUNT      ! PRV$V_MOUNT   ! Запрос на монтирование тома

  NETMBX     ! PRV$V_NETMBX  ! Создавать устройство сети

  ACNT       ! PRV$V_NOACNT  ! СоздавAть процессы, для ко-

             !               ! торых не ведется учет

  OPER       ! PRV$V_OPER    ! Все операторские привилегии

  PFNMAP     ! PRV$V_PFNMAP  ! Отображать секцию по номеру

             !               ! физической страницы

  PHY_IO     ! PRV$V_PHY_IO  ! Выполнять операции физическо-

             !               ! го ввода-вывода

  PRMCEB     ! PRV$V_PRMCEB  ! Создавать постоянные кластеры




                           - 567 -

                        00152-01 97 06


                                        Продолжение табл. 51

  ----------------------------------------------------------

  Привилегия ! Символическое !  Описание

             !     имя       !

  ----------------------------------------------------------

             !               ! общих флагов событий

  PRMGBL     ! PRV$V_PRMGBL  ! Создавать постоянные глобаль-

             !               ! ные секции

  PRMJNL     ! PRV$V_PRMJNL  ! Можно содавать постоянные

             !               ! журналы

  PRMMBX     ! PRV$V_PRMMBX  ! Создавать постоянные почто-

             !               ! вые ящики

  PSWAPM     ! PRV$V_PSWAPM  ! Изменить режим обмена про-

             !               ! цессов

  READALL    ! PRV$V_READALL ! Иметь доступ на чтение лю-

             !               ! бого об'екта

  SECURITY   ! PRV$V_SECURITY! Может выполнять функции по

             !               ! обеспечению защиты

  ALTPRI     ! PRV$V_SETPRI  ! Устанавливать (изменять) лю-

             !               ! бой приоритет процесса

  SETPRV     ! PRV$V_SETPRV  ! Устанавливать любые привиле-

             !               ! гии процесса

  SHARE      ! PRV$V_SHARE   ! Можно назначить канал не раз-

             !               ! деляемому устройству

  SHMEM      ! PRV$V_SHMEM   ! Создавать структуры в памяти,

             !               ! разделяемой несколькими про-

             !               ! цессорами




                           - 568 -

                        00152-01 97 06


                                        Продолжение табл. 51

  ----------------------------------------------------------

  Привилегия ! Символическое !  Описание

             !     имя       !

  ----------------------------------------------------------

  SYSGBL     ! PRV$V_SYSGBL  ! Создавать системные глобаль-

             !               ! ные секции

  SYSLCK     ! PRV$V_SYSLCK  ! Ставить в очередь запросы на

             !               ! общесистемные ресурсы

  SYSNAM     ! PRV$V_SYSNAM  ! Помещать имя в системную таб-

             !               ! лицу логических имен

  SYSPRV     ! PRV$V_SYSPRV  ! Получать доступ к файлам и

             !               ! другим ресурсам так, как если

             !               ! бы процесс имел системный UIC

  TMPJNL     ! PRV$V_TMPJNL  ! Можно создавать временные

             !               ! журналы

  TMPMBX     ! PRV$V_TMPMBX  ! Создавать временные почтовые

             !               ! ящики

  UPGRADE    ! PRV$V_UPGRADE ! Можно повышать классификацию

  VOLPRO     ! PRV$V_VOLPRO  ! Подавлять защиту тома

  WORLD      ! PRV$V_WORLD   ! Управление всеми процессами


       Имена битов PRV$V_NOACNT и  PRV$V_SETPRI  соответстуют

  именам привилегий ACNT и ALTPRI диалогового командного язы-

  ка, хотя они отличаются по написанию.

       Пользовательская привилегия SETPRV требуется для  пре-

  доставления процессу  любых  привилегий,  отличных  от  его

  собственных. Если вызывающий процесс не имеет данной приви-



                           - 569 -

                        00152-01 97 06


  легии, маска привилегий  минимизируется  с  учетом  текущих

  привилегий создающего процесса. Те привилегии,  которых  не

  имеет создающий процесс, не предоставляются, но код состоя-

  ния ошибки не возвращается.

        QUOTA

        Использование в МОС ВП: ITEM_QUOTA_LIST

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по ссылке

       Квоты, которые предоставляются создаваемому  процессу.

  Данные квоты ограничивают использование системных  ресурсов

  создаваемым процессом. Аргумент QUOTA -  это  адрес  списка

  дескрипторов квот, где  каждый  дескриптор  квоты  содержит

  однобайтовое имя квоты, за которым следует  длинное  слово,

  задающее требуемую величину данной квоты. Список дескрипто-

  ров квот заканчивается символическим именем PQL$_LISTEND.

       Если аргумент QUOTA не указан или задан равным  0,  то

  обеспечивается для каждой квоты принятое по умолчанию  зна-

  чение.

       Пример.

  QLIST:     .BYтE   PQL$PRCLM    ; предельное количество

                                  ; подпроцессов

             .LONG   2            ; максимум 2

             .BYTE   PQL$_ASTLM   ; предельное количество

                                  ; AST

             .LONG   6            ; максимально 6 внешних

                                  ; AST




                           - 570 -

                        00152-01 97 06


             .BYTE   PQL$_LISTEND ; конец списка квот

       Символические имена квот определяют при помощи  макро-

  команды $PQLDEF.

       Описание каждой квоты содержит ее минимальное значение

  (параметр системной генерации), ее значение, принимаемое по

  умолчанию (параметр системной генерации), а также, является

  ли она уменьшаемой, неуменьшаемой квотой или  квотой  пула.

  Данные термины имеют следующее значение:

  минимальное значение -

       Если процесс не имеет квоты, равной  или  большей  чем

       Данный минимум, то он не может быть создан.  Минималь-

       Ное значение квоты можно получить,  с  помощью  SYSGEN

       Для того, чтобы выдать на экран  соответсвующий  пара-

       Метр;

  значение, принятое по умолчанию -

       Если список квот не указывает значения  для  отдельной

       Квоты, операционная система МОС ВП назначает  процессу

       Данное принимаемое по умолчанию значение.  Принимаемое

       По  умолчанию  значение  можно  получить,  при  помощи

       SYSGEN для того, чтобы выдать на экран  соотвествующий

       Параметр;

  уменьшаемая квота

       При создании подпроцесса  значение  уменьшаемой  квоты

       Вычитается из  текущей  квоты  создающего  процесса  и

       Возвращается создающему процессу, когда данный подпро-

       Цесс удаляется. Квоты никогда не отнимаются у  создаю-

       Щего процесса, если создается отсоединенный процесс;




                           - 571 -

                        00152-01 97 06


  неуменьшаемая квота -

       Неуменьшаемые  квоты  организуются  и   поддерживаются

       Отдельно для каждого процесса и подпроцесса;

  квота пула -

       Квоты пула организуются  при  создании  отсоединенного

       Процесса, и их разделяют  данный  процесс  и  все  его

       Порожденные подпроцессы. Расходы на квоты  пула  вычи-

       Таются по мере их  использования  из  текущего  общего

       Количества доступных квот и возвращаются обратно, ког-

       Да они не используются.

       Для того, чтобы выполнить SYSGEN для определения  мим-

  нимальных и принятых по умолчанию значений квоты, необходи-

  мо выдать следующую последовательность команд:

        $RUN SYS$SYSTEM:SYSGEN

        SYSGEN> SHOW/PQL

       Минимальные значения имеют имя PQL_MXXXXX, где "XXXXX"

  последние 5 символов имени квоты.

       Принятые по умолчанию значения имеют  имя  PQL_DXXXXX,

  где "XXXXX" - последние 5 символов имени квоты.

       Список квот:

       PQL$_ASTLM          - предел AST. Данная квота ограни-

                           чивает как количество  запрошенных

                           подпрограмм  AST,   задаваемых   в

                           вызове  тех  программ   системного

                           обслуживания,  которые   допускают

                           адрес AST, так и  возможное  коли-

                           чество запросов на запланированное




                           - 572 -

                        00152-01 97 06


                           пробуждение.

        Минимальное значение:           PQL_MASTLM

        принятое по умолчанию значение: PQL_DASTLM

        неуменьшаемая квота

       PQL$_BIOLM          - предел           буферизованного

                           ввода-вывода. Данная квота ограни-

                           чивает   количество    запрошенных

                           буферизованных операционной систе-

                           мой МОС ВП операций  ввода-вывода.

                           Буферизованной           операцией

                           ввода-вывода является такая опера-

                           ция, которая  использует  промежу-

                           точный буфер из системного пула, а

                           не буфер, задаваемый  процессом  в

                           запросе $QIO.

        Минимальное значение:            PQL_MBIOLM

        принятое по умолчанию значение:  PQL_DBIOLM

        неуменьшаемая квота

       PQL$_BYTLM          - квота  количества   байтов   для

                           буферизованного ввода-вывода. Дан-

                           ная квота ограничивает  количество

                           системного  пространства,  которое

                           можно использовать  для  буферизо-

                           ванных операций  ввода-вывода  или

                           для  создания  временных  почтовых

                           ящиков.






                           - 573 -

                        00152-01 97 06


        минимальное значение:            PQL_MBYTLM

        принятое по умолчанию значение:  PQL_DBYTLM

        квота пула

       PQL$_CPULM          - предел времени CPU, задаваемый в

                           миллисекундах. Данная квота  огра-

                           ничивает общее количество  времени

                           CPU,  котрое  может   использовать

                           создаваемый  процесс.  Когда  пре-

                           дельная квота  времени  CPU  исте-

                           кает, созданный процесс  удаляется

                           с кодом возврата SS$_EXCPUTIM.

       Если данная квота  не  указана,  и  созданный  процесс

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

  получает по умолчанию значение данной квоты, равное 0, т.е.

  Неограниченное время CPU.

       Если данная квота  не  указана,  и  созданный  процесс

  является подпроцессом, то данный подпроцесс получает  поло-

  вину предельной квоты времени CPU создающего процесса.

       Если данная квота задана как 0, то  созданный  процесс

  имеет неограниченное время CPU при условии, если  создающий

  процесс также имеет неограниченное время CPU. Однако,  если

  создающий процесс не имеет неограниченного времени CPU,  то

  созданный процесс получает половину предельной квоты време-

  ни CPU создающего процесса.

       Предельная квота  времени  CPU  является  потребляемой

  квотой, т.е., количество времени CPU,  использованное  соз-

  данным процессом, при удалении созданного процесса не возв-




                           - 574 -

                        00152-01 97 06


  ращается создающему процессу.

        Минимальное значение:            PQL_MCPULM

        принятое по умолчанию значение:  PQL_DCPULM

        уменьшаемая квота

       PQL$_DIOLM          - квота прямого ввода-вывода. Дан-

                           ная квота ограничивает  количество

                           запрошенных    операций    прямого

                           ввода-вывода.  Операцией   прямого

                           ввода-вывода является такая опера-

                           ция, для которой операционная сис-

                           тема МОС ВП захватывает страницы в

                           памяти,    на    время    операции

                           ввода-вывода.

        Минимальное значение:            PQL_MDIOLM

        принятое по умолчанию значение:  PQL_DDIOLM

        неуменьшаемая квота

       PQL$_ENQLM          - квота запросов на захват. Данная

                           квота ограничивает количество зап-

                           росов на захват,  которые  процесс

                           может поставить в очередь.

        Минимальное значение:            PQL_MENQLM

        принятое по умолчанию значение:  PQL_DENQLM

        квота пула

       PQL$_FILLM          - квота  открытых  файлов.  Данная

                           квота ограничивает количество фай-

                           лов, которые процесс может  однов-

                           ременно открыть.




                           - 575 -

                        00152-01 97 06


        минимальное значение:            PQL_MFILLM

        принятое по умолчанию значение:  PQL_DFILLM

        квота пула

       PQL$_JTQUOTA        - квота  таблицы  задания.  Данная

                           квота ограничивает количество бай-

                           тов системного  страничного  пула,

                           используемой для таблицы  логичес-

                           ких имен задания.  Данный  элемент

                           игнорируется,   если   создаваемый

                           процесс является подпроцессом.

        Минимальное значение:            PQL_MJTQUOTA

        принятое по умолчанию значение:  PQL_DJTQUOTA

        уменьшаемая квота

       PQL$_PGFLQUOTA      - квота файла обмена страниц. Дан-

                           ная квота ограничивает  количество

                           страниц, которое  можно  использо-

                           вать, чтобы обеспечить для  выпол-

                           нения процесса вторичную память  в

                           файле обмена страниц.

        Минимальное значение:            PQL_MPGFLQUOTA

        принятое по умолчанию значение:  PQL_DPGFLQUOTA

        квота пула

       PQL$_PRCLM          - квота подпроцессов. Данная квота

                           ограничивает количество подпроцес-

                           сов, которые  может  создать  про-

                           цесс.






                           - 576 -

                        00152-01 97 06


        минимальное значение:            PQL_MPRCLM

        принятое по умолчанию значение:  PQL_DPRCLM

        квота пула

       PQL$_TQELM          - квота элементов в очереди к тай-

                           меру.  Данная  квота  ограничивает

                           как количество запросов в  очереди

                           к таймеру, ждущих своего  разреше-

                           ния,  так  и  создание   временных

                           кластеров общих флагов событий.

        Минимальное значение:            PQL_MTQELM

        принятое по умолчанию значение:  PQL_DTQELM

        квота пула

       PQL$_WSDEFAULT      - принятый  по  умолчанию   размер

                           рабочего  набора.   Данная   квота

                           определяет  количество  страниц  в

                           принятом  по   умолчанию   рабочем

                           наборе для  какого-нибудь  образа,

                           выполяемого процессом.  Максималь-

                           ный размер, который можно задавать

                           для  данной  квоты,   определяется

                           квотой размера рабочего набора.

        Минимальное значение:            PQL_MWSDEFAULT

        принятое по умолчанию значение:  PQL_DWSDEFAULT

        неуменьшаемая квота

       PQL$_WSEXTENT       - квота расширения рабочего  набо-

                           ра. Данная квота ограничивает мак-

                           симальный  размер,   до   которого




                           - 577 -

                        00152-01 97 06


                           образ может расширять размер свое-

                           го  рабочего  набора  при   помощи

                           программы системного  обслуживания

                           $ADJWSL.

        Минимальное значение:            PQL_MWSEXTENT

        принятое по умолчанию значение:  PQL_DWSEXTENT

        неуменьшаемая квота

       PQL$_WSQUOTA        - квота размера  рабочего  набора.

                           Данная квота  огарничивает  макис-

                           мальный размер, до которого  образ

                           может захватывать страницы в своем

                           рабочем наборе при помощи програм-

                           мы     системного     обслуживания

                           $LCKPAG.

        Минимальное значение:            PQL_MWSQUOTA

        принятое по умолчанию значение:  PQL_DWSQUOTA

        неуменьшаемая квота

       Значения, заданные в списке квот, не  являются  обяза-

  тельными квотами, которые будут фактически назначены созда-

  ваемому процессу. Программа системного обслуживания $CREPRC

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

  значения квот необходимо назначить:

       1) строит принятый по умолчанию список для создаваемо-

  го процесса, назанчая ему для всех квот принятые по умолча-

  нию значения. Принятые по умолчанию значения являются пара-

  метрами SYSGEN и поэтому  могут  изменяться  при  генерации

  операционной системы МОС ВП;




                           - 578 -

                        00152-01 97 06


       2) читает заданный список квот, если он есть, и обнов-

  ляет соответсвующие элементы в принятом по умолчанию  спис-

  ке. Если список квот содержит несколько элементов для одной

  квоты, то используется только последняя спецификация;

       3) сравнивает для каждого элемента в обновленном спис-

  ке квот значения квоты с  требуемым  минимальным  значением

  (также параметр  SYSGEN)  и  использует  большее  значение.

  Затем:

       - если создается подпроцесс или создается  отсоединен-

         ный процесс, но создающий процесс не имеет  привиле-

         гии DETACH, то полученное  значение  сравнивается  с

         текущим значением соответствующей  квоты  создающего

         процесса и используется меньшее значение. Если квота

         является уменьшаемой, данное значение вычитается  из

         квоты создающего процесса и делается проверка, оста-

         лась ли у создающего процесса по крайней мере  мини-

         мальная квота. Если нет, то возвращается код состоя-

         ния SS$_EXQUOTA и подпроцесс или отсоединенный  про-

         цесс не создается. Квота пула игнорируется;

       - если создается  отсоединенный  процесс  и  создающий

         процесс имеет привилегию DETACH, то полученное  зна-

         чение не сравнивается с текущим значением соответст-

         вующей квоты создающего процесса и не вычитается  из

         квоты  создающего  процесса.   Служебная   программа

         $CREPRC не проверяет,  может  ли  заданная  величина

         квоты превысить максимум,  допускаемый  операционной

         системой МОС ВП.




                           - 579 -

                        00152-01 97 06


        PRCNAM

        Использование в МОС ВП: PROCESS_NAME

        Тип:                    текстовая строка

        Доступ:                 только чтение

        Механизм:               по дескриптору - дескриптор

                                строки фиксированной длины

       Имя, которое необходимо присвоить создаваемому процес-

  су. Аргумент PRCNAM  -  это  адрес  дескриптора  символьной

  строки, указывающего на строку имени, содержащую от 1 до 15

  символов.

       Создается подпроцесс, то имя процесса неявно  квалифи-

  цируется номером группы UIC создающего процесса. Если  соз-

  дается отсоединенный процесс, то  имя  процесса  квалифици-

  руется номером группы, заданным в аргументе UIC.

        BASPRI

        Использование в МОС ВП: LONGWORD_UNSIGNED

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Базовый приоритет, который необходимо назначить созда-

  ваемому процессу. Аргумент BASPRI - это значение размером в

  длинное слово в диапазоне от 0 до 31, где  31  -  наивысший

  приоритет, а 0 - низший. Обычные приоритеты изменяются от 0

  до 15, приоритеты реального времени - от 16 до 31.

       Для того, чтобы процесс мог  устанавливать  приоритеты

  выше, чем его собственный приоритет, он должен иметь приви-

  легию SETPRI. Если вызывающий процесс не имеет данной  при-




                           - 580 -

                        00152-01 97 06


  вилегии, то заданный базовый приоритет сравнивается с прио-

  ритетом вызывающего процесса и используется меньшее из дан-

  ных двух значений.

        UIC

        Использование в МОС ВП: UIC

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Код идентификации пользователя (UIC), который  необхо-

  димо присвоить создаваемому процессу. Аргумент  UIC  -  это

  значение размером в длинное слово, представляющее UIC.

       Если аргумент UIC не задан  или  задан  равным  0  (по

  умолчанию), программа $CREPRC создает процесс и присваивает

  ему UIC создающего процесса.

       Если UIC содержит ненулевое значение, то $CREPRC  соз-

  дает отсоединенный процесс. Заданное число интерпретируется

  как 32-разрядное восьмеричное число с двумя  полями  по  16

  разрядов:

        1) биты 0 - 15   -    номер члена;

        2) биты 16 - 31  -    номер группы.

       Для создания отсоединенного процесса с  UIC,  отличным

  от UIC создающего процесса, требуется привилегия DETACH.

        MBXUNT

        Использование в МОС ВП: WORD_UNSIGNED

        Тип:                    слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению




                           - 581 -

                        00152-01 97 06


       Номер устройства почтового ящика, предназначенного для

  получения сообщения о завершении  при  удалении  созданного

  процесса. Аргумент MBXUNT - это  слово,  содержащее  данный

  номер.

       Если аргумент MBXUNT не указан или задан равным 0  (по

  умолчанию), операционная система МОС ВП не посылает сообще-

  ния о завершении, когда она удаляет процесс.

       Для того, чтобы получить  номер  устройства  почтового

  ящика, необходимо использовать служебную программу $GETDVI.

       Если аргумент MBXUNT задан, почтовый ящик  не  исполь-

  зуется, пока созданный процесс  фактически  не  завершится.

  Когда это произойдет в  контексте  завершающегося  процесса

  вызывается служебная программа $ASSIGN для подключения поч-

  тового ящика и в почтовый ящик посылается  учетное  сообще-

  ние. Если почтовый ящик уже  существует,  либо  его  нельзя

  подключить, либо он полон, то возникает  такая  же  ошибка,

  как если бы почтовый ящик не был задан.

       Учетное сообщение посылается до того,  как  начинается

  свертывание образа, но после того, как имя  процесса  уста-

  навливается нулевым.  Таким  образом,  от  момента  посылки

  учетного  сообщения  до  окончательного  удаления  процесса

  может проходить значительный интервал времени.

       Для получения учетного  сообщения  вызывающий  процесс

  должен выполнить операцию чтения  из  почтового  ящика.  По

  завершении операции ввода-вывода второе длинное слово блока

  состояния ввода-вывода (если блок задан) содержит идентифи-

  кацию удаленного процесса.




                           - 582 -

                        00152-01 97 06


       Макрокоманда $ACCDEF  определяет  символические  имена

  для смещений полей в учетном сообщении. В табл. 52 перечис-

  лены смещения, их символичесике имена и содержание  каждого

  поля. Там, где длина поля не указана, она равна 4 байтам.

                                                   Таблица 52

  -----------------------------------------------------------

  Сме-  !     Имя        !       Содержание

  щение !                !

  -----------------------------------------------------------

  0     ! ACC$W_MSGTYP   ! MSG$_DELPROC (2 байта)

  2     !                ! не используется (2 байта)

  4     ! ACC$L_FINALSTS ! Код состояния при выходе

  8     ! ACC$L_PID      ! Идентификация процесса

  12    !                ! не используется (4 байта)

  16    ! ACC$Q_TERMINATE! Текущее время завершения про-

        !                ! цесса в системном формате (8 бай-

        !                ! тов)

  24    ! ACC$T_ACCOUNT  ! Учетное имя процесса, дополнен-

        !                ! ное пробелами (8 байтов)

  32    ! ACC$T_USERNAME ! Имя пользователя, дополненное

        !                ! пробелами (12 байтов)

  44    ! ACC$L_CPUTIM   ! Время CPU, использованное про-

        !                ! цессом, в 10-миллисекундных

        !                ! единицах

  48    ! ACC$L_PAGEFLTS ! Количество стриничных отказов,

        !                ! полученных процессом

  52    ! ACC$L_PGFLPEAK ! Пик использования файла обмена




                           - 583 -

                        00152-01 97 06


                                         Продолжение табл. 52

  -----------------------------------------------------------

  Сме-  !     Имя        !       Содержание

  щение !                !

  -----------------------------------------------------------

        !                ! страниц

  56    ! ACC$L_WSPEAK   ! Максимальный размер рабочего

        !                ! набора

  60    ! ACC$L_BIOCNT   ! Количество буферизованных опе-

        !                ! раций ввода-вывода, выполнен-

        !                ! ных процессом

  64    ! ACC$L_DIOCNT   ! Количество операций прямого

        !                ! ввода-вывода, выполненных про-

        !                ! цессом

  68    ! ACC$L_VOLUMES  ! Количество томов, смонтирован-

        !                ! ных процессом

  72    ! ACC$O_LOGIN    ! Время подключения процесса, в

        !                ! системном формате (8 байтов)

  80    ! ACC$L_OWNER    ! Идентификация процесса вла-

        !                ! дельца

       Длина   сообщения   о   завершении   равна   константе

  ACC$K_TERMLEN.

        STSFLG

        Использование в МОС ВП: MASK_LONGWORD

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению




                           - 584 -

                        00152-01 97 06


       Возможности,  выбранные  для  создаваемого   процесса.

  Аргумент STSTFLG - это вектор размером в длинное слово, где

  бит соответствует какой-то возможности. Используются только

  биты с 0 по 10, биты с 11 по 31 не  используются  и  должны

  быть нулевыми.

       Каждая  возможность  (бит)  имеет  символическое  имя,

  которое определяют при помощи макрокоманды  $PRCDEF.  Аргу-

  мент STSFLG строится путем выполнения операции  "логическое

  или" с использованием  символических  имен  всех  требуемых

  возможностей. Символические имена всех возможностей следую-

  щие:    

       PRC$M_SSRWAIT       - запретить режим ожидания  ресур-

                           са;

       PRC$M_SSFEXCU       - разрешить  режим  исключительной

                           ситуации по ошибке служебной прог-

                           раммы;

       PRC$M_PSWAPM        - подавить  обмен  процесса.  Тре-

                           буется привилегия PSWAMP;

       PRC$M_NOACNT        - не  выполнять  учет.   Требуется

                           привилегия NOACNT;

       PRC$M_BATCH         - создать пакетный  процесс.  Тре-

                           буется привилегия DETACH;

       PRC$M_HIBER         - перевести процесс  в  спячку  до

                           начала выполнения образа;

       PRC$M_IMGDMP        - включить  средство  дампирования

                           образа. Если образ заканчивается в

                           результате необрабатываемых  усло-




                           - 585 -

                        00152-01 97 06


                           вий, средство дампирования  образа

                           записывает  содержимое   адресного

                           пространства в файл,  имеющийся  в

                           текущем  принятом   по   умолчанию

                           каталоге пользователя.  Имя  файла

                           должно  быть  таким  же,  как  имя

                           завершенного образа. Тип  файла  -

                           DMP;

       PRC$M_NOUAF         - не проверять  файл  авторизации,

                           если процесс является  отсоединен-

                           ным, и образ - LOGINOUT.EXE.  Дан-

                           ную возможность не  следует  зада-

                           вать, если создается подпроцесс;

       PRC$M_NETWRK        - создать процесс, который являет-

                           ся об'ектом соединения сети.  Тре-

                           бует привилегии DETACH;

       PRC$M_DISAWS        - запретить  регулировку  рабочего

                           набора, инициируемую  операционной

                           системой МОС ВП;

       PRC$M_DETACH        - создать отсоединенный процесс;

       PRC$M_INTER         - создать  интерактивный  процесс.

                           Данная возможность имеет  значение

                           только в том случае, если аргумент

                           IMAGE                       задает

                           SYS$SYSTEM:LOGINUOT.EXE.  Назначе-

                           ние данной возможности в том, что-

                           бы обеспечить пользователей инфор-




                           - 586 -

                        00152-01 97 06


                           мацией  о  процессе.  Если  данная

                           возможность задана, она  идентифи-

                           цирует процесс как имеющий связь с

                           человеком, интерактивный  процесс.

                           Например,  если  пользователь  при

                           помощи лексической функции  F$MODE

                           диалогового    командного    языка

                           делает запрос о процессе, которому

                           была      задана       возможность

                           PRC$M_INTER, то F$MODE  возвращает

                           значение "INTERACTIVE".

       PRC$M_NOPASSWORD    - не выводить на  экран  подсказки

                           USERNAME: и PASSWORD:,  если  про-

                           цесс  является   интерактивным   и

                           отсоединенным,    а    образ     -

                           SYS$SYSTEM:LOGINUOT.EXE.      Если
            
                           пользователь указывает данную воз-

                           можность   в   вызове    программы

                           $CREPRC, то процесс, созданный  по

                           данному вызову, регистрируется под

                           именем,   присвоенным   создающему

                           процессу. Если для  интерактивного

                           процесса  данная  возможность   не

                           задана,          то          образ

                           SYS$SYSTEM:LOGINUOT.EXE     выдает

                           пользователю подсказки  для  ввода

                           имени пользователя и пароля,  наз-




                           - 587 -

                        00152-01 97 06


                           начаемых процессу. Подсказки выво-

                           дятся на устройство SYS$INPUT.


       Описание.

       Вызывающий процесс должен иметь:

       1) привилегию DETACH,  чтобы  создать  следующие  типы

  процессов:

       - отсоединенный процесс с UIC, отличным от  UIC  вызы-

         вающего процесса;

       - пакетный процесс;

       - сетевой процесс;

       2) привилегию ALTPRI для создания подпроцессов с более

  высоким базовым приоритетом, чем у вызывающего процесса;

       3) привилегию SETPRV для создания процессов с привиле-

  гиями, которых не имеет вызывающий процесс;

       4) привилегию PSWAPM для создания процессов с запреще-

  нием режима обмена процессов;

       5) привилегию NOACNT для создания процесса с  запреще-

  нием учетных функций;

       6) привилегию NETMBX для создания  об'екта  соединения

  сети.

       Отсоединенный процесс является  полностью  независимым

  процессом. Например, процесс, который создает  операционная

  система  МОС  ВП  при  подключении  пользователя,  является

  отсоединенным процессом.

       С другой стороны, подпроцесс связан  с  создающим  его

  процессом по древовидной структуре; он получает часть  квот

  ресурсов создающего процесса и должен заканчиваться  раньше



                           - 588 -

                        00152-01 97 06


  создающего процесса. Будет создаваемый процесс подпроцессом

  или отсоединенным процессом - это определяет  аргумент  UIC

  или флаг PRC$M_DETACH.

       Служебная программа $CREPRC требует системной  динами-

  ческой памяти.

       Количество подпроцессов, которые  может  создать  про-

  цесс, регулируется квотой подпроцессов (PRCLM). Данная кво-

  та возвращается при удалении подпроцесса.

       Количество отсоединенных процессов, которые может соз-

  дать процесс с тем  же  именем  пользователя,  регулируется

  элементом MAXDETACH в файле авторизации пользователя.

       При создании подпроцесса значение  каждой  уменьшаемой

  квоты вычитается из общей  величины,  доступной  создающему

  процессу, а  при  удалении  подпроцесса  не  использованная

  часть каждой уменьшаемой квоты снова  добавляется  к  общей

  величине квот, доступной создающему процессу. Все  значения

  квот пула разделяются создающим процессом и его  подпроцес-

  сами.

       Некоторые условия ошибки не обнаруживаются, пока  соз-

  даваемый процесс не выполняется.  Данные  условия  включают

  неверный или несуществующий образ, неверные эквиваленты для

  логических имен SYS$INPUT, SYS$OUTPUT или  SYS$ERROR,  неа-

  декватные квоты или отсутствие привилегий, необходимых  для

  выполнения запрошенного образа.

       Все подпроцессы, созданные процессом, должны  заканчи-

  ваться до того, как будет удален  создающий  процесс.  Если

  подпроцессы существуют на  момент  удаления  создавшего  их




                           - 589 -

                        00152-01 97 06


  процесса, то они автоматически удаляются.

       Созданный  процесс  сможет  выполнять  образ,  который

  вызывает      программу      исполнительной      библиотеки

  LIB$DO_COMMAND, только в том случае, если процесс был  соз-

  дан с аргументом IMAGE,  задающим  SYS$SYSTEM:LOGINOUT.EXE.

  Дело в том, что SYS$SYSTEM:LOGINOUT.EXE приводит к  отобра-

  жению интерпретатора языка команд  в  создаваемый  процесс,

  что    является    необходимым    условием    для    вызова

  LIB$DO_COMMAND.

       Отсоединенный процесс считается интерактивным только в

  том случае, если:

       1) процесс создан с указанием возможности PRC$M_INTER;

       2) устройство SYS$INPUT не определено  как  ориентиро-

  ванное на файлы.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_ACCVIO          - вызывающая  программа  не  может

                           прочитать заданную входную  строку

                           или дескриптор строки, список при-

                           вилегий  или  список  квот;   либо

                           вызывающая  программа   не   может

                           записать идентификацию процесса;

       SS$_DUPLNAM         - заданное имя процесса  дублирует

                           имя, уже существующее внутри  дан-

                           ной группы;

       SS$_EXQUOTA         - имеется по крайней мере одно  из

                           трех следующих условий:



                           - 590 -

                        00152-01 97 06


       1) процесс превысил свою квоту для создания подпроцес-

  сов;

       2) значение квоты, указанное для создания подпроцесса,

  превышает соответствующую квоту создающего процесса;

       3) квота является  уменьшаемой,  и  квота,  остающаяся

  создающему процессу, будет меньше минимального значения.

       SS$_INSFMEM         - недостаточно  системной  динами-

                           ческой памяти для запрошенной опе-

                           рации;

       SS$_IVLOGNAM        - имеется хотя  бы  одно  из  двух

                           следующих условий:

       1) заданное имя процесса имеет нулевую длину или длину

  более 15 символов;

       2) либо заданное имя образа, имя входного или выходно-

  го устройства, либо имя диагностического устройства длиннее

  255 символов.

       SS$_IVQUOTAL        - список квот имеет неверный  фор-

                           мат;

       SS$_IVSTSFLG        - установлен   недопустимый   флаг

                           состояния;

       SS$_NOPRIV          - вызывающая  программа   нарушила

                           одно из ограничений на привилегии;

       SS$_NOSLOT          - нет блока управления  процессом.

                           Иными словами,  достигнуто  макси-

                           мальное  количество   одновременно

                           существующих в системе процессов;

       SS$_INSSWAPSPACE    - недостаточно пространства обмена




                           - 591 -

                        00152-01 97 06


                           для создания процесса;

       SS$_EXPRCLM         - создание отсоединенного процесса

                           закончилось по ошибке, потому  что

                           создающий процесс уже достиг свое-

                           го предела по созданию отсоединен-

                           ных процессов. Данный предел уста-

                           навливается  квотой  MAXDETACH   в

                           файле   авторизации   пользователя

                           создающего процесса.



       13.27. $CREATE_RDB - создать базу данных прав


       Служебная программа  $CREATE_RDB  инициализирует  базу

  данных прав.

       Формат:

       SYS$CREATE_RDB [SYSID]


       Аргумент

        SYSID

        Использование в МОС ВП: SYSTEM_ACCESS_ID

        Тип:                    квадрослово

        Доступ:                 только чтение

        Механизм:               по ссылке

       Значение идентификации системы, которое связывается  с

  базой данных прав после завершения  программы  $CREATE_RDB.

  Аргумент SYSID является  адресом  квадрослова,  содержащего

  значение идентификации.  Если  аргумент  SYSID  опущен,  то

  используется текущее системное время в 64-битовом формате.




                           - 592 -

                        00152-01 97 06


       Описание

       Служебная программа  $CREATE_RDB  инициализирует  базу

  данных прав. Имя базы данных  прав  является  именем  файла

  приравненным логическому имени RIGHTLIST. Данное имя должно

  быть определено как системное логическое имя с режимом дос-

  тупа управления. Если логичесоке имя отсутствует,  то  база

  данных получает имя SYS$SYSTEM:RIGTHSLIST.DAT.

       Если база данных прав  уже  существует,  то  программа

  $CREATE_RDB заканчивается с ошибкой RMS$_FEX.

       Для использования данной служебной программы требуется

  доступ с чтением в базе данных прав. Если база данных  прав

  принадлежит SYS$SYSTEM: (что принимается по умолчанию),  то

  для получения доступа с записью в базу данных прав требует-

  ся привилегия SYSPRV.


       Возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_ACCVIO          - вызывающий процесс не может про-

                           читать аргумент SYSID;

       SS$_INSFMEM         - для открытия  базы  данных  прав

                           нет доступной динамической  памяти

                           процесса достаточного размера;

       RMS$_FEX            - база данных прав уже существует.

                           Чтобы создать новую  базу  данных,

                           необходимо явно удалить или переи-

                           меновать старую базу данных прав;

       RMS$_PRV            - пользователь не имеет доступа  с

                           записью в SYS$SYSTEM:



                           - 593 -

                        00152-01 97 06


       Поскольку база данных прав является индексным  файлом,

  доступ к которому осуществляется с помощью системы управле-

  ния данными СУД-32, данная служебная программа может  также

  возвращать коды состояния СУД-32,  связанные  с  операциями

  над индексным файлом (см. Документ [1]).



       13.28. $CRETVA - создать виртуальное  адресное

              пространство


       Служебная  программа  $CRETVA  добавляет  определенное

  число обнуляемых при загрузке страниц к виртуальному адрес-

  ному пространству процесса для выполнения текщего образа.


       Формат:

       SYS$CRETVA INADR,[RETADR],[ACMODE]


       Аргументы:

        INADR

        Использование в МОС ВП: ADDRESS_RANGE

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по ссылке

       Адрес массива из двух слов,  содержащего  начальный  и

  конечный  виртуальные  адреса  создаваемых  страниц.   Если

  начальный и конечный виртуальные адреса одинаковые, то соз-

  дается одна страница. В  виртуальных  адресах  используется

  только часть, представляющая  номер  виртуальной  страницы.

  Младшие 9 битов игнорируются.





                           - 594 -
        
                        00152-01 97 06


        RETADR

        Использование в МОС ВП: ADDRESS_RANGE

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по ссылке - ссылка на массив

                                или дескриптор

       Адрес массива из двух слов, предназначенного для полу-

  чения начального и конечного виртуальных  адресов  страниц,

  созданных фактически.

        ACMODE

        Использование в МОС ВП: ACCESS_MODE

        Тип:                    длинное слово (без знака)

        Доступ:                 только чтение

        Механизм:               по значению

       Режим доступа и защита  для  новых  страниц.  Аргумент

  ACMODE - это длинное слово, содержащее режим досупа. Макро-

  команда $PSLDEF определяет следующие обозначения для  четы-

  рех режимов доступа:

       1) PSL$C_KERNEL - режим ядра;

       2) PSL$C_EXEC - режим управления;

       3) PSL$C_SUPER - супервизорный режим;

       4) PSL$C_USER - пользовательский режим.

       Наивысшим привилегированным используемым режимом  дос-

  тупа является режим доступа  вызывающей  программы.  Защита

  страниц заключается в том, что операции чтения/записи  раз-

  решены для результирующего режима доступа и более  привиле-

  гированных режимов.




                           - 595 -

                        00152-01 97 06


       Описание.

       Квота файла обмена страниц процесса (PGFLQUOTA) должна

  быть достаточной для увеличивающегося размера  виртуального

  адресного пространства.

       Страницы создаются, начиная с адреса в первом  длинном

  слове, которое находится по адресу, заданному  в  аргументе

  INADR, и кончая адресом,  содержащимся  во  втором  длинном

  слове. Конечный адрес  может  быть  меньше,  чем  начальный

  адрес. Аргумент RETADR возвращает адреса  байтов  созданных

  страниц.

       Если во время создания страниц  возникает  ошибка,  то

  аргумент RETADR, если он указан, показывает страницы, кото-

  рые были успешно созданы до возникновения ошибки.  Если  не

  было создано ни одной страницы, то оба длинных слова  аргу-

  мента RETADR содержат -1.

       Если программа $CRETVA создает страницы,  которые  уже

  существуют, то она удаляет данные  страницы,  если  они  не

  принадлежат более привилегированному по сравнению  с  вызы-

  вающей программой режиму доступа. Все такие удаленные стра-

  ницы повторно инициализируются как обнуляемые при  загрузке

  страницы.

       Примечание. Не следует использовать программы  систем-

  ного обслуживания $CNTREG или $CRETVA в сочетании с другими

  написанными  пользователем  процедурами   или   программами

  исполнительной библиотеки. Данные программы системного обс-

  луживания не обеспечивают средств для сообщения другим про-

  цедурам об изменениях в виртуальном адресном пространстве.




                           - 596 -

                        00152-01 97 06


       Возвращаемые значения кода состояния:

       SS$NORMAL           - успешное завершение;

       SS$_ACCVIO          - вызывающая  программа  не  может

                           прочитать аргумент  INADR  или  не

                           может записать аргумент RETADR;

       SS$_EXQUOTA         - процесс превысил свою квоту фай-

                           ла обмена страниц;

       SS$_INSFWSL         - максимального  размера  рабочего

                           набора  процесса  не  хватает  для

                           увеличившегося виртуального адрес-

                           ного пространства;

       SS$_NOPRIV          - страница  в  заданном  диапазоне

                           является   страницей    системного

                           адресного пространства;

       SS$_PAGOWNVIO       - страница  в  заданном  диапазоне

                           уже существует, и ее  нельзя  уда-

                           лить, потому что  она  принадлежит

                           более привилегированному по  срав-

                           нению  с   вызывающей   программой

                           режиму доступа;

       SS$_VASFULL         - виртуальное адресное пространст-

                           во процесса заполнено. Нет  доста-

                           точного  пространства  для  таблиц

                           запрошенных страниц.










                           - 597 -

                        00152-01 97 06
           

       13.29. $CRMPSC - создать и отобразить секцию


       Программа системного  обслуживания  $CRMPSC  позволяет

  процессу  связать  (отобразить)  секцию  своего   адресного

  пространства с заданной  секцией  файла  (секции  дискового

  файла) или с заданными физическими адресами, представленны-

  ми номерами физических страниц (секции физических страниц).

       Кроме того, данная программа позволяет  процессу  соз-

  дать любой тип секции и указать, что данная секция доступна

  только создающему процессу (личная секция) или всем процес-

  сам, которые ее отображают (глобальная секция).

       Формат:

       SYS$CRMPSC [INADR],[RETADR],[ACMODE],[FLAGS]

                  ,[GSDNAM],[IDENT],[RELPAG],[CHAM]

                  ,[PAGCNT],[VBN],[PROT],[PFC]

       Аргументы:

       INADR

       Использование в МОС ВП: ADDRESS_RANGE

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по ссылке

       Начальный и конечный виртуальные  адреса,  на  которые

  должна отображаться секция. Аргумент INADR - это адрес мас-

  сива из двух длинных слов, содержащего начальный и конечный

  виртуальные адреса процесса. В каждом  адресе  используется

  только часть, представляющая  номер  виртуальной  страницы,

  младшие 9 битов игнорируются.





                           - 598 -

                        00152-01 97 06


       Если начальный и конечный виртуальные адреса  одинако-

  вые, то отображается одна страница, если в аргументе  FLAGS

  не установлен бит SEC$M_EXPREG. Если данный бит установлен,

  то заданный адрес просто определяет, должна секция  отобра-

  жаться в программную область (P0)  или  область  управления

  (P1).

       Если аргумент INADR не указан или задан равным  0,  то

  секция не отображается.

       RETADR

       Использование  в МОС ВП: ADDRESS_RANGE

       Тип:                     длинное слово (без знака)

       Доступ:                  только запись

       Механизм:                по ссылке

       Начальный и конечный виртуальные  адреса,  на  которые

  программа $CRMPSC фактически  отобразила  секцию.  Аргумент

  RETADR - это адрес массива из двух длинных слов, содержаще-

  го начальный и конечный виртуальные адреса процесса.

       ACMODE

       Использование в МОС ВП: ACCESS_MODE

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Режим доступа, который будет владельцем страниц,  соз-

  данных во время отображения. Аргумент ACMODE - это  длинное

  слово, содержащее режим доступа.








                           - 599 -

                        00152-01 97 06


       Макрокоманда $PSLDEF определяет  для  четырех  режимов

  доступа следующие обозначения:

            1) PSL$C_KERNEL - режим ядра;

            2) PSL$C_EXEC - режим управления;

            3) PSL$C_SUPER - супервизорный режим;

            4) PSL$C_USER - пользовательский режим.

       Наиболее  привилегированный  режим  доступа,   который

  может использоваться - это режим доступа  вызывающей  прог-

  раммы.

       FLAGS

       Использование в МОС ВП: MASK_LONGWORD

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Маска флагов, определяющая как тип создаваемой и отоб-

  ражаемой секции, так и ее характеристики. Аргумент FLAGS  -

  это битовый вектор размером в длинное слово, где каждый бит

  соответствует флагу. Макрокоманда  $SECDEF  определяет  для

  каждого флага символические имена. Аргумент FLAGS  строится

  путем выполнения операции "логическое или" над  символичес-

  кими именами всех желаемых флагов.

       Символические имена, их описания и значения,  принятые

  по умолчанию:

       SEC$M_GBL - страницы образуют  глобальную  секцию.  По

  умолчанию принимается личная секция;

       SEC$M_CRF - страницы копируются по ссылке. По  умолча-

  нию страницы являются разделяемыми;




                           - 600 -

                        00152-01 97 06


       SEC$M_DZRO  -  страницы  загружаются  обнуленными.  По

  умолчанию при копировании они не обнуляются;

       SEC$M_EXPREG - страницы отображаются в первое  доступ-

  ное место. По умолчанию страницы отображаются  в  диапазон,

  заданный аргументом INADR;

       SEC$M_WRT   -    страницы    образуют    секцию    для

  чтения/записи. По умолчанию страницы образуют секцию, пред-

  назначенную только для чтения;

       SEC$M_PERM - страницы являются постоянными. По умолча-

  нию страницы являются временными;

       SEC$M_PFNMAP -  страницы  образуют  секцию  физических

  страниц. По умолчанию страницы  образуют  секцию  дискового

  файла.  Страницы,  отображенные  с   использованием   флага

  SEC$M_PFNMAP не включаются в рабочий  набор  процесса;  они

  всегда действительны. Не следует фиксировать данные страни-

  цы в рабочем наборе при помощи программы $LKWSET; это может

  привести к машинной ошибке;

       SEC$M_SYSGBL - страницы образуют системную  глобальную

  секцию. По умолчанию страницы образуют групповую глобальную

  секцию;

       SEC$M_PAGFIL -  страницы  образуют  глобальную  секцию

  файла страниц. По умолчанию страницы образуют секцию диско-

  вого файла;

       SEC$M_EXECUTE - страницы отображаются, если вызывающая

  программа  имеет  режим  доступа  управления.  Данный  флаг

  действителен только в том случае, если он задан  из  режима

  управления или из режима ядра и, если также установлен флаг




                           - 601 -

                        00152-01 97 06


  SEC$M_GBL. По умолчанию страницы отображаются независимо от

  того, имеет ли вызывающая программа режим доступа  управле-

  ния.

       GSDNAM

       Использование в МОС ВП: SECTION_NAME

       Тип:                    строка текста

       Доступ:                 только чтение

       Механизм:               по дескриптору - дескриптор

                               строки с фиксированной длиной

       Имя глобальной секции. Аргумент GSDNAME  -  это  адрес

  дескриптора символьной строки, указывающего на строку  име-

  ни. В подпункте 11.6.5.1 описан формат данной строки имени.

       Для групповых глобальных секций  операционная  система

  МОС ВП интерпретирует группу UIC как часть имени глобальной

  секции, таким образом, имена  глобальных  секций  уникальны

  для групп UIC.

       IDENT

       Использование в МОС ВП: SECTION_ID

       Тип:                    квадрослово (без знака)

       Доступ:                 только чтение

       Механизм:               по ссылке

       Идентифицирующее значение, которое задает номер версии

  глобальной секции и для процессов, отображающих  существую-

  щую глобальную секцию, критерий соответствия идентификаций.

  Аргумент IDENT - это адрес структуры длиной в  квадрослово,

  содержащий три поля.

       Номер версии находится во втором длинном слове.  Номер




                           - 602 -

                        00152-01 97 06


  версии содержит два поля: младшую идентификацию  в  младших

  24 битах и старшую идентификацию в старших 8 битах.  Значе-

  ние данным полям можно присвоить путем установки соглашений

  о различии версий глобальных секций. Если при создании сек-

  ции номер версии не указан, то процессы, которые при  отоб-

  ражении секции задают номер версии, не могут получить  дос-

  туп к данной глобальной секции.

       Первое длинное слово в  младших  3  битах  -  критерий

  соответствия. Допустимые значения критериев,  символические

  имена, при помощи которых можно указывать  критерии,  и  их

  значения приведены в табл.53.


                                                  Таблица 53

  ----------------------------------------------------------

  Значение !      Имя     !      Критерий соответствия

  ----------------------------------------------------------

  0        ! SEC$K_MATALL ! Соответствуют все версии секции

  1        ! SEC$K_MATEQU ! Соответствуют только те секции,

           !              ! для которых соответствуют стар-

           !              ! шая и младшая идентификации

  2        ! SEC$K_MATLEQ ! Соответствуют те секции, для

           !              ! которых старшие идентификации

           !              ! равны, а младшая идентификация,

           !              ! заданная отображающим процессом,

           !              ! меньше или равна младшей иден-

           !              ! тификации глобальной секции


       Если секция отображается  во  время  ее  создания,  то




                           - 603 -

                        00152-01 97 06


  поле, управляющее соответствием, игнорируется.

       Если аргумент IDENT не указан или  задан  равным  нулю

  (принимается по умолчанию), то поля номера версии и  управ-

  ления соответствием по умолчанию принимаются равными нулю.

       RELPAG

       Использование в МОС ВП: LONGWORD_UNSIGNED

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Относительный номер страницы внутри глобальной секции,

  который должен быть первой страницей  отображаемой  секции.

  Аргумент RELPAG -  это  длинное  слово,  содержащее  данный

  номер страницы.

       Данный аргумент  используется  только  для  глобальных

  секций. Если аргумент RELPAG не указан или задан  равным  0

  (принимается по умолчанию), то  глобальная  секция  отобра-

  жается начиная с первого виртуального блока в файле.

       CHAN

       Использование в МОС ВП: CHANNEL

       Тип:                    слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Номер канала, на котором осуществляется доступ к  фай-

  лу. Аргумент CHAN - это слово, содержащее данный номер.

       Доступ к файлу необходимо открывать при помощи  макро-

  команды $OPEN; параметр (FOP) в блоке FAB  должен  задавать

  открытие  пользовательского  файла  (ключевое  слово  UFO).




                           - 604 -

                        00152-01 97 06


  режим доступа, для которого открывается канал, должен  быть

  таким же или менее привилегированным по сравнению с режимом

  доступа вызывающей программы.

       PAGCNT

       Использование в МОС ВП: LONGWORD_UNSIGNED

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Количество страниц в секции.  Аргумент  PAGCNT  -  это

  длинное слово, содержащее данное значение.

       Указанное количество страниц сравнивается с  количест-

  вом страниц в файле  секции;  если  количество  страниц  не

  задано или равно 0 (принимается по умолчанию),  то  исполь-

  зуется размер файла секции. Однако  для  секции  физических

  страниц этот аргумент не должен быть нулевым.

       VBN

       Использование в МОС ВП: LONGWORD_UNSIGNED

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Номер виртуального блока  в  файле,  который  отмечает

  начало секции. Аргумент VBN - это длинное слово, содержащее

  данный номер. Если аргумент VBN не указан или задан  равным

  0 (принимается по умолчанию), то секция создается,  начиная

  с первого виртуального блока в файле.

       Если задано отображение физической страницы  (установ-

  лен флаг SEC$M_PFNMAP), то  аргумент  VBN  указывает  номер




                           - 605 -

                        00152-01 97 06


  физической страницы, с которой начинается секция в  памяти.

  В табл.54 описано, какие аргументы являются  обязательными,

  а  какие  -  необязательными  для  трех  различных  случаев

  использования программы системного обслуживания $CRMPSC.


                                              Таблица 54

            Обязательные и необязательные аргументы

           программы системного обслуживания $CRMPSC

       -------------------------------------------------

                   ! Создать/  ! Отобразить! Создать/

         Аргумент  ! отобразить! глобальную! отобразить

                   ! глобальную! секцию    ! личную

                   ! секцию    !           ! секцию

       -------------------------------------------------

       INADR       ! Необяза-  ! Обязатель-! Обязатель-

                   ! тельный   ! ный       ! ный

       RETADR      ! Необяза-  ! Необяза-  ! Необяза-

                   ! тельный   ! тельный   ! тельный

       ACMODE      ! Необяза-  ! Необяза-  ! Необяза-

                   ! тельный   ! тельный   ! тельный

       FLAGS       !           !           !

       SEC$M_GBL   ! Обязатель-! Игнориру- !    -

                   ! ный       ! ется      !

       SEC$M_CRF   ! Необяза-  ! Не исполь-! Необяза-

                   ! тельный   ! зуется    ! тельный

       SEC$M_DZRO  ! Необяза-  ! Не исполь-! Необяза-

                   ! тельный   ! зуется    ! тельный




                           - 606 -

                        00152-01 97 06


                                    Продолжение табл. 54

       -------------------------------------------------

                   ! Создать/  ! Отобразить! Создать/

         Аргумент  ! отобразить! глобальную! отобразить

                   ! глобальную! секцию    ! личную

                   ! секцию    !           ! секцию

       -------------------------------------------------

       SEC$M_EXPREG! Необяза-  ! Необяза-  ! Необяза-

                   ! тельный   ! тельный   ! тельный

       SEC$M_PERM  ! Необяза-  ! Не исполь-! Не исполь-

                   ! тельный   ! зуется    ! зуется

       SEC$M_PFNMAP! Необяза-  ! Не исполь-! Не исполь-

                   ! тельный   ! зуется    ! зуется

       SEC$M_SYSGBL! Необяза-  ! Необяза-  ! Не исполь-

                   ! тельный   ! тельный   ! зуется

       SEC$M_WRT   ! Необяза-  ! Необяза-  ! Необяза-

                   ! тельный   ! тельный   ! тельный

       SEC$M_PAGFIL! Необяза-  ! Не исполь-! Не исполь-

                   ! тельный   ! зуется    ! зуется

       GSDNAM      ! Обязатель-! Обязатель-! Не исполь-

                   ! ный       ! ный       ! зуется

       IDENT       ! Необяза-  ! Необяза-  ! Не исполь-

                   ! тельный   ! тельный   ! зуется

       RELPAG      ! Необяза-  ! Необяза-  ! Не исполь-

                   ! тельный   ! тельный   ! зуется

       CHAN        ! Обязатель-!           ! Обязатель-

                   ! ный       !           ! ный




                           - 607 -

                        00152-01 97 06


                                    Продолжение табл. 54

       -------------------------------------------------

                   ! Создать/  ! Отобразить! Создать/

         Аргумент  ! отобразить! глобальную! отобразить

                   ! глобальную! секцию    ! личную

                   ! секцию    !           ! секцию

       -------------------------------------------------

       PAGCNT      ! Обязатель-!           ! Обязатель-

                   ! ный       !           ! ный

       VBN         ! Необяза-  !           ! Необяза-

                   ! тельный   !           ! тельный

       PROT        ! Необяза-  !           ! Не исполь-

                   ! тельный   !           ! зуется

       PFC         ! Необяза-  !           ! Необяза-

                   !           !           ! тельный

                   ! тельный   !           !


       PROT

       Использование в МОС ВП: FILE_PROTECTION

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Цифровое значение, представляющее маску защиты,  кото-

  рая применяется к данной глобальной  секции.  Данная  маска

  логически складывается ("логическое или") с маской  защиты,

  связанной с файлом; если защита файла не  разрешает  доступ

  определенной категории пользователей,  а  задаваемая  маска

  защиты разрешает, то доступ запрещается.



                           - 608 -

                        00152-01 97 06


       Маска содержит четыре 4-битовых поля.  Биты  в  каждом

  поле читаются справа налево. На рис.56 показан формат  мас-

  ки.


                      Маска защиты

       -------------------------------------------------
       !   Все     !  Группа   !  Владелец !  Система  !
       -------------------------------------------------
       !  !  !  !  !  !  !  !  !  !  !  !  !  !  !  !  !
       !D !E !W !R !D !E !W !R !D !E !W !R !D !E !W !R !
       !  !  !  !  !  !  !  !  !  !  !  !  !  !  !  !  !
       -------------------------------------------------

                         Рис. 56



       Сброшенные биты указывают,  что  конкретной  категории

  пользователей предоставляется  доступ  на  чтение  (R),  на

  запись (W), на выполнение (E) и на удаление (D).

       Для защиты секции имеют значение только доступ на чте-

  ние, на запись и на выполнение. Биты  доступа  на  удаление

  игнорируются. Бит доступа на выполнение  программа  $CRMPSC

  проверяет только в том случае, если вызов сделан из  режима

  ядра или из режима управления.

       Если аргумент PROT не указан, или задан равным  0,  то

  доступ на чтение и запись предоставляется всем  пользовате-

  лям.

       PFC

       Использование в МОС ВП: LONGWORD_UNSIGNED

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению





                           - 609 -

                        00152-01 97 06


       Размер кластера страничного отказа.  Размер  кластера,

  если он задан, показывает, сколько страниц необходимо  заг-

  ружать в память, если произошел страничный отказ для  одной

  страницы. Данный аргумент не используется для секций  физи-

  ческих страниц.

       Описание.

       Если страницы секции копируются по ссылке, то  процесс

  должен  иметь  достаточную  квоту  файла   обмена   страниц

  (PGFLQUOTA). Количество страниц в файлах глобальных страниц

  для всей системы ограничивается параметром системной  гене-

  рации GBLPAGFIL.

       Создание секции дискового файла  включает  определение

  всего или части дискового  файла  или  секции.  Отображение

  секции дискового файла включает  установление  соответствия

  между виртуальными блоками в файле и страницами виртуально-

  го адресного пространства вызывающего процесса. Если  прог-

  рамме системного  обслуживания  $CRMPSC  задана  глобальная

  секция, которая не сущетвует, то программа отображает ее.

       Если в вызове  $SRMPSC  указана  глобальная  секция  и

  получен код возврата SS$NOPRIV, то возможно, что процесс не

  имеет привилегии, требуемой для создания такой секции.

       Чтобы  создавать  глобальные  секции,  процесс  должен

  иметь следующие привилегии:

       1) привилегию SYSGBL для создания системной глобальной

  секции;

       2) привилегию PRMGBL для создания постоянной  глобаль-

  ной секции;




                           - 610 -

                        00152-01 97 06


       3) привилегию PFNMAP для  создания  секции  физических

  страниц.

       Для отображения существующей секции физических страниц

  не требуется привилегии PFNMAP.

       В зависимости от того, какая фактически запрошена опе-

  рация, опеделенные аргументы являются  либо  обязательными,

  либо необязательными. В  табл.54  показано,  как  программа

  системного обслуживания $CRMPSC  интерпретирует  переданные

  ей аргументы, и при каких условиях она требует или  игнори-

  рует аргументы.

       Когда программа $CRMPSC отображает секцию,  она  вызы-

  вает программу  системного  обслуживания  $CRETVA  (создать

  виртуальное адресное пространство), чтобы добавить  к  вир-

  туальному адресному пространству процесса страницы,  задан-

  ные  аргументом  INADR  или  запрошенные  установкой   бита

  SEC$M_EXPREG. Данные виртуальные адреса могут быть в облас-

  ти программы (P0) или в области управления (P1).

       Программа системного обслуживания  $CRMPSC  возвращает

  виртуальные адреса созданных  страниц  в  аргумент  RETADR,

  если он указан. Секция отображается от  младших  адресов  к

  старшим независимо  от  того,  отображается  эта  секция  в

  область программы или в область управления.

       Если во время отображения глобальной  секции  возникла

  ошибка, то аргумент  RETADR,  если  он  укзан,  показывает,

  какие страницы были  успешно  отображены  до  возникновения

  ошибки. Если не было отображено ни одной страницы,  то  оба

  длинных слова аргумента RETADR содержат минус 1.




                           - 611 -

                        00152-01 97 06


       Если глобальная секция является постоянной, то она  не

  удаляется, если операция отображения закончилась по ошибке.

       Установка флага SEC$M_PFNMAP  определяет,  что  память

  для секции начинается с номера физической страницы,  задан-

  ного в аргументе VBN, и простирается на количество  станиц,

  заданное в аргументе PAGCNT.

       Установка флага SEC$M_PFNMAP дает ограничения на  сле-

  дующие аргументы:

       1) RELPAG не применяется;

       2) CHAN должен быть нулевым;

       3) PAGCNT  должен  быть  задан;  нулевое  значение  не

  допускается;

       4) VBN задает первую отображаемую физическую страницу;

       5) PFC не применяется.

       Кроме того, установка флага SEC$M_PFNMAP создает огра-

  ничения на значения других флагов:

       1) SEC$M_CRF должен быть 0;

       2) SEC$M_DZRO должен быть 0;

       3) SEC$M_PERM должен быть 1,  если  установлены  флаги

  SEC$M_GBL SEC$M_SYSGBL.

       Установка флага SEC$M_PAGFIL дает следующие  ограниче-

  ния на флаги:

       1) SEC$M_CRF должен быть 0;

       2) SEC$M_GBL должен быть 1;

       3) SEC$M_PFNMAP должен быть 0.

       Биты с 4 по 13 (включительно) и с 18  по  31  (включи-

  тельно) аргумента FLAGS должны быть нулевыми.




                           - 612 -

                        00152-01 97 06


       Бит флага SEC$M_WRT применим только к способу, которым

  отображается вновь создаваемая секция. Для  файла,  который

  будет допускать запись, канал,  используемый  для  открытия

  файла, должен разрешать доступ на запись в файл.

       Если установлен бит флага SEC$M_SYSGBL, то  бит  флага

  SEC$M_GBL также должен быть установлен.

       Возвращаемые значения кода состояния:

       SS$_NORMAL      - успешное завершение. Указанная  гло-

                       бальная  секция  уже  существовала   и

                       теперь была отображена;

       SS$_CREATED     - успешное завершение. Указанной  гло-

                       бальной секции не было, и  теперь  она

                       создана;

       SS$_ACCVIO      - вызывающая программа не может прочи-

                       тать аргумент INARG, аргумент  GSDNAME

                       или дескриптор имени; либо  вызывающая

                       программа не может  записать  аргумент

                       RETADR;

       SS$_ENDOFFILE   - предупреждение.    Заданный    номер

                       начального виртуального блока  выходит

                       за логический конец файла, либо значе-

                       ние аргумента RELPAG больше  или  рано

                       значению аргумента PAGCNT;

       SS$_EXBYTELM    - процесс превысил квоту счетчика бай-

                       тов; система не может отобразить  зап-

                       рошенный файл;

       SS$_EXGBLPAGFIL - процесс  превысил  установленный   в




                           - 613 -

                        00152-01 97 06


                       системе предел на количество  глобаль-

                       ных страниц в файле страниц; не  отоб-

                       ражается вся секция;

       SS$_EXQUOTA     - процесс превысил квоту файла  обмена

                       страниц  при  создании  копируемых  по

                       ссылке страниц или страниц файла вспо-

                       могательной памяти;

       SS$_GPTFULL     - в системной таблице глобальных стра-

                       ниц больше  нет  места  для  элементов

                       таблицы страниц,  предназначенных  для

                       данной секции;

       SS$_GSDFULL     - в системном пространстве нет  больше

                       места для хранения управляющей  инфор-

                       мации, связанной с глобальными секция-

                       ми;

       SS$_ILLPAGCNT   - количество страниц для  файла  физи-

                       ческих страниц отрицательное или нуле-

                       вое;

       SS$_INSFMEM     - в указанной  разделяемой  памяти  не

                       хватает страниц  для  создания  данной

                       секции;

       SS$_INSFWSL     - предела рабочего набора процесса  не

                       хватает  для  увеличившегося   размера

                       адресного пространства;

       SS$_INTERLOCK   - захват битовой карты для разделяемой

                       памяти уже сделан другим процессом;

       SS$_IVCHAN      - задан неверный номер канала, то есть




                           - 614 -

                        00152-01 97 06


                       номер канала равен нулю или  превышает

                       количество доступных каналов;

       SS$_IVCHNLSEC   - канал с указанным номером в  настоя-

                       щее время активен;

       SS$_IVLOGNAM    - заданое имя глобальной секции  имеет

                       нулевую длину или длину более 15  сим-

                       волов;

       SS$_IVLVEC      - указанная  секция  была  установлена

                       без    использования     квалификатора

                       PROTECT;

       SS$_IVSECFLG    - задан неверный или зарезервированный

                       флаг, или флаг, требующий  привилегию,

                       которой у пользователя нет, или невер-

                       ная комбинация флагов;

       SS$_IVSECIDCTL  - недопустимое поле  управления  соот-

                       ветствием в  идентификации  глобальной

                       секции;

       SS$_NOTFILEDEV  - устройство не является ориентирован-

                       ным на файлы устройством или устройст-

                       вом с произвольным доступом;

       SS$_NOPRIV      - процесс не имеет привилегий для соз-

                       дания  системной   глобальной   секции

                       (SYSGBL) или постоянной групповой гло-

                       бальной секции  (PRMGBL).  Процесс  не

                       имеет привилегии для  создания  секций

                       физических страниц (PFNMAP). Страница,

                       указанная в диапазоне входных адресов,




                           - 615 -

                        00152-01 97 06


                       находится в системном адресном  прост-

                       ранстве. Указанный канал не  назначен,

                       либо назначен более привилегированному

                       режиму доступа;

       SS$_NOSHMBLOCK  - для глобальных секций нет доступного

                       управляющего блока разделяемой памяти;

       SS$_NOWRT       - нельзя записывать в  секцию,  потому

                       что установлен  бит  флага  SEC$M_WRT,

                       файл предназначен только для чтения  и

                       не установлен бит флага SEC$M_CRF;

       SS$_PAGOWNVIO   - страница в заданном диапазоне  вход-

                       ных адресов принадлежит более привиле-

                       гированному режиму доступа;

       SS$_SECTBLFUL   - нет доступных  элементов  в  таблице

                       системных глобальных секций;

       SS$_SHMNOTCNCT  - разделяемая память, имя которой было

                       задано в аргументе GSDNAM,  неизвестна

                       системе. Данная ошибка может быть выз-

                       вана орфографической ошибкой в строке,

                       неверно присвоенным логическим  именем

                       или ошибкой, допущенной во время  сис-

                       темной генерации при определении памя-

                       ти как разделяемой;

       SS$_TOOMANYLNAM - трансляция логического  имени  аргу-

                       мента превысила допустимую глубину;

       SS$_VASFULL     - виртульное   адресное   пространство

                       процесса переполнено; в таблицах стра-




                           - 616 -

                        00152-01 97 06


                       ниц нет места для страниц, создаваемых

                       для отображения глобальной секции.



       13.30. $DACEFC  -  отсоединить  кластер  общих
                                    [[6~
              флагов событий


       Программа системного обслуживания $DACEFC  освобождает

  связь вызывающего процесса с кластером общих  флагов  собы-

  тий.

       Формат:

       SYS$DACEFC EFN

       Аргументы:

       EFN

       Использование в МОС ВП: EF_NUMBER

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Номер любого флага события  в  том  кластере,  который

  отсоединяется от вызывающего процесса. Аргумент EFN являет-

  ся длинным словом, содержащим данный  номер.  Данное  число

  должо быть в диапазоне от 64 до 95 для кластера 2 и  от  96

  до 127 для кластера 3.

       Описание.

       Счетчик процессов, связанных с кластером,  уменьшается

  с каждым отсоединенным процессом. Когда образ, связанный  с

  кластером, выходит из системы, кластер отсоединяется. Клас-

  тер автоматически удаляется, когда значение  счетчика  про-

  цессов, связанных с временным кластером  или  с  постоянным



                           - 617 -

                        00152-01 97 06


  кластером, который помечен для удаления, достигает нуля.

       Если процесс вызывает данную программу системного обс-

  луживания, указывая на кластер флагов событий,  с  которыми

  он не связан, то программа завершается успешно.

       Возвращаемые значения кода состояния:

       SS$_NORMAL     - программа успешно завершилась;

       SS$_ILLEFC     - указан недопустимый номер флага собы-

                      тия. Номер должен быть в  диапазоне  от

                      64 до 127;

       SS$_INTERLOCK  - битовая карта для распределения клас-

                      теров общих флагов событий из указанной

                      разделяемой памяти заблокирована другим

                      процессом.



       13.31. $DALLOC - освободить устройство


       Программа системного обслуживания $DALLOC  освобождает

  ранее распределенное устройство. Вызывающий процесс отказы-

  вается от исключительного использования  этого  устройства,

  тем самым разрешая другим процессам назначать или распреде-

  лять это устройство.

       Формат:

       SYS$DALLOC [DEVNAM],[ACMODE]













                           - 618 -

                        00152-01 97 06  


       Аргументы:

       DEVNAM (имя устройства)

       Использование в МОС ВП: DEVICE_NAME

       Тип:                    текстовая строка

       Доступ:                 только чтение

       Механизм:               по дескриптору - дескриптор

                               строки фиксированой длины

       Имя освобождаемого устройства. Аргумент DEVNAM являет-

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

  строку имени устройства. Данная строка может быть либо име-

  нем физического устройства, либо  логическим  именем.  Если

  логическое имя, то оно должно транслироваться в  имя  физи-

  ческого устройства.

       Если имя устройства не задано,  то  освобождаются  все

  устройства, распределенные  процессом  из  режимов  доступа

  одинаково или менее привилегированных, чем  заданное  аргу-

  ментом ACMODE.

       ACMODE (режим доступа)

       Использование в МОС ВП: ACCESS_MODE

       Тип:                    длинное слово (без знака)

       Доступ:                 только запись

       Механизм:               по значению

       Режим доступа, для которого  выполняется  освобождение

  устройства. Аргумент ACMODE является длинным словом, содер-

  жащим режим доступа.








                           - 619 -

                        00152-01 97 06


       Макрокоманда $PSLDEF определяет следующие  символичес-

  кие имена для четырех режимов доступа:

       1) PSL$C_KERNEL - режим ядра;

       2) PSL$C_EXEC - режим управления;

       3) PSL$C_SUPER - режим супервизора;

       4) PSL$C_USER - режим пользователя.

       Наиболее привилегированным используемым режимом досту-

  па является режим доступа вызывающего процесса.

       Описание.

       Распределенное устройство можно освободить  только  из

  режимов доступа равных или более привилегированных, чем тот

  режим доступа,  из  которого  было  сделано  первоначальное

  распределение.

       Данная программа системного обслуживания не  освободит

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

  имеет один или более каналов ввода-вывода, назначенных дан-

  ному устройству. В таком случае устройство остается распре-

  деленным.

       При выходе образа операционная система МОС ВП  автома-

  тически освобождает все устройства, которые были  распреде-

  лены пользователем.

       Если делается попытка  освободить  почтовый  ящик,  то

  возвращается код успешного завершения, однако никаких  опе-

  раций не выполняется.










                           - 620 -

                        00152-01 97 06


       Возвращаемые значения кода состояния:

       SS$_NORMAL       - программа  системного  обслуживания

                        успешно завершилась;

       SS$_ACCIO        - вызывающий процесс не может  прочи-

                        тать  строку  имени  устройства   или

                        дескриптор строки;

       SS$_DEVASSIGN    - предупреждение. Устройтсво не может

                        быть освобождено,  поскольку  процесс

                        еще имеет каналы, назначенные данному

                        устройству;

       SS$_DEVNOTALLOC  - предупреждение. Устройство не расп-

                        ределено запрашивающему процессу;

       SS$_IVDEVNAM     - не была указана строка  имени  уст-

                        ройства, или строка имени  устройства

                        содержит неверные символы;

       SS$_IVLOGNAM     - строка имени устройства имеет длину

                        0 или более чем 63 символа;

       SS$_NONLOCAL     - предупреждение. Устройство  в  уда-

                        ленном узле;

       SS$_NOPRIV       - устройство должно быть распределено

                        из  более  привилегированного  режима

                        доступа;

       SS$_NOSUCHDEV    - предупреждение.   Указанного   уст-

                        ройства нет в системе.










                           - 621 -

                        00152-01 97 06


       13.32. SS$DASSGN    -     освободить     канал

              ввода-вывода


       Программа системного обслуживания  SS$DASSGN  освобож-

  дает канал ввода-вывода, который был затребован  с  помощью

  программы "назначить канал ввода-вывода" ($ASSIGN).

       Формат:

       SYS$DASSGN  CHAN

       Аргумент:

       CHAN

       Использование в МОС ВП: CHANNEL

       Тип:                    слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Номер  освобождаемого  канала  ввода-вывода.  Аргумент

  CHAN является словом, содержащим этот номер.

       Описание.

       Канал ввода-вывода можно освобождать только из  режима

  доступа равного или более привилегированного, чем тот режим

  доступа, из которого было сделано первоначальное назначение

  канала.

       Когда канал освобождается, отменяются все  невыполнен-

  ные запросы ввода-вывода в данном  канале.  Если  в  канале

  открыт файл, то он закрывается.

       Если при назначении канала с  устройством  был  связан

  почтовый ящик, то связь с данным почтовым  ящиком  ликвиди-

  руется.





                           - 622 -

                        00152-01 97 06


       Если канал ввода-вывода был назначен  для  операции  в

  сети, то данная связь в сети отключается.

       Если указанный канал является последним каналом,  наз-

  наченным устройству, которое помечено  для  демонтирования,

  то устройство демонтируется.

       Каналы ввода-вывода, назначенные из режима пользовате-

  ля, освобождаются при выходе образа.

       Возвращаемые значения кода состояния:

       SS$_NORMAL - программа системного обслуживания успешно

                  завершилась;

       SS$_IVCHAN - указан неверный номер  канала,  равный  0

                  или больший числа доступных каналов;

       SS$_NOPRIV - указанный канал не назначен, или назначен

                  из более привилегированного режима доступа.



       13.33. $DCLAST - об'явить AST


       Программа системного  обслуживания  $DCLAST  ставит  в

  очередь прерывание AST для вызывающего режима  доступа  или

  менее привилегированного режима доступа. Например, програм-

  ма, выполняющаяся в режиме супервизора, может об'явить  AST

  для режима супервизора или режима пользователя.

       Формат:

       SYS$DCLAST   ASTADR,[ASTPRM],[ACMODE]











                           - 623 -

                        00152-01 97 06


       Аргументы:

       ASTADR

       Использование в МОС ВП: AST_PROCEDURE

       Тип:                    маска входа в программу

       Доступ:                 вызов без равертывания стека

       Механизм:               по ссылке

       Программа обработки AST, которая  должна  выполняться.

  Аргумент ASTADR является адресом маски входа  данной  прог-

  раммы.

       ASTPRM

       Использование в МОС ВП: USER_ARG

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Параметр AST, который  должен  передаваться  программе

  AST, указанной аргументом ASTADR. Аргумент ASTPRM  является

  длинным словом, содержащим данный параметр.

       ACMODE

       Использование в МОС ВП: ACCESS_MODE

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Режим доступа,  для  которого  об'является  прерывание

  AST.  Наиболее   привилегированным   используемым   режимом

  является режим вызывающего процесса. Результирующим режимом

  является режим доступа, для которого об'является прерывание

  AST.




                           - 624 -

                        00152-01 97 06


       Описание.

       Программа системного обслуживания $DCLAST требует сис-

  темной динамической памяти и использует принадлежащую  про-

  цессу квоту лимита AST (ASTLM).

       Данная программа системного обслуживания не  проверяет

  адрес программы обработки AST. Если указан  неверный  адрес

  (например, 0), то при передаче управления  программе  обра-
                          [5~
  ботки AST происходит нарушение доступа.

       Возвращаемые значения кода состояния:

       SS$_NORMAL   - программа    системного    обслуживания

                    завершилась нормально;

       SS$_EXQUOTA  - процесс  превисил  квоту   лимита   AST

                    (ASTLM);

       SS$_INSFMEM  - для  завершения  программы   системного

                    обслуживания  нет   доступной   системной

                    динамической памяти достаточного размера.



       13.34. $DCLCMH - об'явить обработчик изменения

              режима или режима совместимости


       Программа системного обслуживания $DCLCMH задает адрес

  программы, которая получает управление, когда:

       1) происходит прерывание по инструкции "изменить режим

  на пользовательский" или "изменить режим на супервизорный";

       2) происходит сбой режима совместимости.









                           - 625 -

                        00152-01 97 06


       Формат:

       SYS$DCLCMH   ADDRES,[PRVHND],[TYPE]

       Аргументы:

       ADDRES

       Использование в МОС ВП: PROCEDURE

       Тип:                    маска входа программы

       Доступ:                 вызов без развертывания стека

       Механизм:               по ссылке

       Программа, которая должна получить  управление,  когда

  происходит прерывание изменения режима или сбой режима сов-

  местимости. Аргумент ADDRES - это адрес маски входа  данной

  программы.

       Если адрес задан нулевым, то $DCLCMH очищает об'явлен-

  ный ранее обработчик.

       PRVHND

       Использование в МОС ВП: ADDRESS

       Тип:                    длинное слово (без знака)

       Доступ:                 только запись

       Механизм:               по ссылке

       Адрес об'явленного ранее обработчика. Аргумент  PRVHND

  - это адрес длинного слова, содержащего адрес ранее  об'яв-

  ленного обработчика.

       TYPE

       Использование в МОС ВП: LONGWORD_UNSIGNED

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению




                           - 626 -

                        00152-01 97 06


       Индикатор типа обработчика. Аргумент TYPE - это значе-

  ние размером в длинное слово. Значение  0  (принимаемое  по

  умолчанию) укзывает на то, то необходимо об'явить  обработ-

  чик изменения режима для того  режима  доступа,  в  котором

  выдан данный запрос; значение 1 указывает,  что  необходимо

  об'явить обработчик режима совместимости.

       Описание.

       Обработчик изменения режима обеспечивает пользователям

  механизм диспетчирования, подобный  тому,  который  исполь-

  зуется для вызовов  программ  системного  обслуживания.  Он

  позволяет вызывать из пользовательского  режима  программу,

  которая  выполняется  в  супервизорном  режиме.  Обработчик

  режима  изменения  об'является  из  супервизорного  режима;

  потом, когда процесс, работающий в пользовательском режиме,

  выдает инструкцию "изменить режим в  супервизорный",  обра-

  ботчик режима изменения получает управление  и  работает  в

  супервизорном режиме.

       Обработчики режима совместимости  используются  опера-

  ционной системой МОС ВП вместо обычных  программ  обработки

  условия, когда образ, работающий  в  режиме  совместимости,

  создает исключительную ситуацию режима совместимости.

       Обработчик  изменения  режима  перед  выходом   должен

  занести сохраняемые значения PC и  PSL  в  стек  по  адресу

  CTL$AL_CMCNTX, а выход  должен  осуществляться  при  помощи

  выдачи инструкции REI.

       Обработчик изменения режима можно об'являть только  из

  пользовательского и супервизорного режима.




                           - 627 -

                        00152-01 97 06


       Возвращаемые значения кода состония:

       SS$_NORMAL  - успешное завершение;

       SS$_ACCVIO  - вызывающая программа не может записать в

                   длинное слово адрес предыдущего обработчи-

                   ка режима изменения.



       13.35. $DCLEXH - об'явить обработчик выхода


       Программа системного  обслуживания  $DCLEXH  об'являет

  программу обработки  выхода,  которая  получит  управление,

  когда будет осуществляться выход образа. Обычно вход образа

  осуществляется, когда образ, выполняемый в процессе на дан-

  ный момент,  возвращает  управление  операционной  системе.

  Кроме того, выход образа  может  осуществиться  при  вызове

  программ системного обслуживания "выход" ($EXIT) или  "при-

  нудительный выход" (FORCEX).

       Формат:

       SYS$DCLEXH   DESBLK

       Аргумент:

       DESBLK

       Использование в МОС ВП: EXIT_HANDLER_BLOCK

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по ссылке

       Управляющий блок обработчика выхода. Аргумент DESBLK -

  адрес управляющего блока. Данный управляющий  блок,  описы-

  вающий обработчик выхода, представлен на рис. 57.





                           - 628 -

                        00152-01 97 06



                        Управляющий блок

        31                                                 0
       ------------------------------------------------------
       ! Ссылка вперед (используется только системой МОС ВП)!
       !----------------------------------------------------!
       !          Адрес обработчика выхода                  !
       !----------------------------------------------------!
       !     Эти три байта должны          ! Количество     !
       !     быть нулевыми                 ! аргументов     !
       !----------------------------------------------------!
       !Адрес кода состояния (записывается системой МОС ВП) !
       !----------------------------------------------------!
       !                                                    !
       :     Дополнительные аргументы обработчика выхода    :
       :     они необязательные;                            :
       :     по одному аргументу на длинное слово           :
       !                                                    !
       ------------------------------------------------------

                            Рис. 57


       Описание.

       Обработчики выхода описываются блоком управления выхо-

  дом. Операционная система  МОС  ВП  поддерживает  отдельный

  список таких блоков управления для пользовательского  режи-

  ма, супервизорного режима и  режима  управления.  Программа

  системного обслуживания $DCLEXH добавляет описание обработ-

  чика в начало одного из этих списков.  Список,  к  которому

  добавляется данный блок  управления  выходом,  определяется

  режимом доступа вызывающей программы.

       Программу $DCLEXH можно вызывать из пользовательского,

  супервизорного режима и из режима управления.

       При выходе образа сначала вызываются обработчики выхо-

  да, об'явленные из пользовательского режима; они вызываются

  в порядке, обратном тому, в котором они были об'явлены.

       Каждый обработчик выхода выполняется только один  раз;




                           - 629 -

                        00152-01 97 06


  для того, чтобы он мог выполниться  снова,  его  необходимо

  повторно об'явить, программа обработки вызывается как обыч-

  ная программа  со  списком  аргументов,  заданным  в  блоке

  управления выходом, начиная с 3-го длинного  слова.  Первый

  аргумент - это адрес длинного слова для получения кода сос-

  тояния системы, указывающего  на  причину  выхода;  система

  всегда заполняет данное длинное слово перед  вызовом  обра-

  ботчика выхода.

       Программа системного обслуживания "отменить обработчик

  выхода" ($CANEXH) удаляет блок управления выходом из  спис-

  ка.

       Возвращаемые значения кода состояния:

       SS$_NORMAL     - успешное завершение;

       SS$_ACCVIO     - вызывающая программа не  может  запи-

                      сать  первое  длинное  слово  в   блоке

                      управления выходом;

       SS$_IVSSRQ     - вызов программы недействителен, пото-

                      му что он сделан из режима ядра;

       SS$_NOHANDLER  - предупреждение. Адрес блока  управле-

                      ния обработчика  выхода  не  задан  или

                      равен 0;



       13.36. $DELLNM - удалить логическое имя


       Программа системного обслуживания $DELLNM удаляет  все

  логические имена с заданным именем в указанном режиме  дос-

  тупа или внешнем режиме доступа; или она удаляет все  логи-

  ческие имена из заданной таблицы в указанном режиме доступа



                           - 630 -

                        00152-01 97 06


  или внешнем режиме доступа. Если какие-то логические имена,

  которые удаляются данной программой, являются также именами

  таблиц логических имен, то все логические  имена,  содержа-

  щиеся в данных таблицах, и все их подтаблицы также удаляют-

  ся.

       Формат:

       SYS$DELLNM   TABNAM,[LOGNAM],[ACMODE]

       Аргументы:

       TABNAM

       Использование в МОС ВП: LOGICAL_NAME

       Тип:                    текстовая строка

       Доступ:                 только чтение

       Механизм:               по дескриптору - дескриптор

                               строки фиксированной длины

       Имя таблицы логических имен или имя списка  таблиц,  в

  которых должен быть выполнен поиск  удаляемого  логического

  имени. Аргумент TABNAM является адресом дескриптора,  кото-

  рый указывает на имя таблицы. Это обязательный аргумент.

       Если аргумент TABNAM не явлется именем  таблицы  логи-

  ческих имен, то предполагается,  что  это  логическое  имя,

  которое должно итеративно транслироваться до тех пор,  пока

  не будет найдено имя таблицы логических имен, либо пока  не

  будет превышено допустимое число трансляций.












                           - 631 -

                        00152-01 97 06


       Если аргумент TABNAM транслируется в имя  списка  таб-

  лиц, то программа $DELLNM делает следующее:

       1) если задан аргумент LOGNAM, то программа просматри-

  вает (по порядку) каждую таблицу из списка, пока не  найдет

  первую таблицу, содержащую указанное логическое  имя.  Если

  это логическое имя имеет заданный режим доступа,  то  прог-

  рамма удаляет все вхождения логического имени для заданного

  режима доступа и внешних режимов доступа в этой таблице;

       2) если аргумент LOGNAM не задан, то программа удаляет

  все логические имена указанного режима  доступа  и  внешних

  режимов доступа из первой же таблицы в  списке,  чей  режим

  доступа равен или менее привилегированный, чем режим досту-

  па вызывающего процесса.

       LOGNAM

       Использование в МОС ВП: LOGICAL_NAME

       Тип:                    текстовая строка

       Доступ:                 только чтение

       Механизм:               по дескриптору - дескриптор

                               строки фиксированной длины

       Логическое имя,  которое  должно  удаляться.  Аргумент

  LOGNAM является адресом дескриптора, который  указывает  на

  строку логического имени.

       ACMODE

       Использование в МОС ВП: ACCESS_MODE

       Тип:                    байт (без знака)

       Доступ:                 только чтение

       Механизм:               по ссылке




                           - 632 -

                        00152-01 97 06


       Режим доступа, который должен использоваться в  опера-

  ции  удаления.  Аргумент  ACMODE  является  адресом  байта,

  содержащего  данный  режим  доступа.  Макрокоманда  $PSLDEF

  определяет символические имена для четырех режимов доступа.

       Режим доступа, который в действительности используется

  в операции удаления,  определяется  "максимизацией"  режима

  доступа вызывающего процесса и  режима  доступа,  заданного

  аргументом ACMODE; это означает, что используется  наименее

  привилегированный их этих режимов доступа.

       Однако,  если  вызывающий  процесс  имеет   привилегию

  SYSNAM, то операция удаления выполняется в заданном  режиме

  доступа независимо от режима доступа самого этого процесса.

       Если данный аргумент опущен или задан равным 0,  то  в

  операции удаления используется  режим  доступа  вызывающего

  процесса.

       Режим доступа, ипользуемый в операции удаления,  опре-

  деляет, какие таблицы и какие имена удаляются.

       Описание.

       В зависимости  от  операции,  использование  программы

  $DELLNM может потребовать от вызывающего  процесса  опреде-

  ленных привилегий:

       1) для удаления логического имени из разделяемой  таб-

  лицы требуется доступ с записью к таблице логических  имен,

  содержащей данное логическое имя;

       2) для удаления разделяемой  таблицы  логических  имен

  требуется либо доступ с удаленем к данной таблице  логичес-

  ких имен, либо доступ с записью к каталогу таблиц, содержа-




                           - 633 -

                        00152-01 97 06


  щему нужное имя таблицы;

       3) для удаления либо логического имени,  либо  таблицы

  для внутреннего режима требуется привилегия SYSNAM;

       4) для удаления логического имени из групповой таблицы

  требуется привилегия GRPNAM или SYSPRV;

       5) для удаления логического имени из системной таблицы

  требуется привилегия SYSNAM или SYSPRV.

       Возвращаемые значения кода состояния:

       SS$_NORMAL      - успешное завершение;

       SS$_ACCVIO      - программа системного обслуживания не

                       может получить доступ к адресу, задан-

                       ному одним или более аргументами;

       SS$_BADPARAM    - один  или  более  параметров   имеют

                       неверное значение, или не указано  имя

                       таблицы логических имен;

       SS$_IVLOGNAM    - аргумент  LOGNAM  указывает  строку,

                       чья длина не лежит в требуемом  диапа-

                       зоне от 1 до 255 символов;

       SS$_IVLOGTAB    - аргумент TABNAM не указывает на таб-

                       лицу логических имен;

       SS$_NOLOGNAM    - не  существует   указанной   таблицы

                       логических имен, или в  таблице  логи-

                       ческих имен не существует  логического

                       имени с режимом  доступа,  равным  или

                       менее  привилегированным,  чем   режим

                       доступа вызывающего процесса;

       SS$_NOLOGTAB    - не  существует   указанной   таблицы




                           - 634 -

                        00152-01 97 06


                       логических имен;

       SS$_NOPRIV      - вызывающему  процессу   не   хватает

                       необходимой  привилегии  для  удаления

                       логического имени;

       SS$_TOOMANYNAM  - число трансляций  логического  имени

                       для имени таблицы превысило допустомое

                       число (10 трансляций).



       13.37. $DELMBX - удалить почтовый ящик


       Программа  системного  обслуживания  $DELMBX  помечает

  постоянный почтовый ящик для  удаления.  Реальное  удаление

  почтового ящика и связанного с ним логического имени проис-

  ходит, когда больше нет каналов, назначенных этому почтово-

  му ящику.

       Формат:

       SYS$DELMBX   CHAN

       Аргументы:

       CHAN

       Использование в МОС ВП: CHANNEL

       Тип:                    слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Номер канала, назначенного  почтовому  ящику,  который

  должен быть удален. Аргумент CHAN является словом, содержа-

  щим данный номер.







                           - 635 -

                        00152-01 97 06


       Описание.

       В зависимости  от  операции,  использование  программы

  $DELMBX может потребовать от вызывающего  процесса  наличие

  определенных привилегий. Например, для удаления постоянного

  почтового ящика требуется привилегия PRMMBX.

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

  режим доступа которого равен или  более  привилегированный,

  чем режим доступа процесса, которому назначен канал  почто-

  вого ящика.

       Временный почтовый ящик автоматически удаляется, когда

  значение его счетчика обращений доходит до нуля.

       Программа системного обслуживания $DELMBX не  освобож-

  дает канал, назначенный вызывающим  процессом,  если  такой

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

  программой  системного   обслуживания   "освободить   канал

  ввода-вывода".

       Возвращаемые значения кода состояния:

       SS$_NORMAL     - программа   системного   обслуживания

                      успешно завершилась;

       SS$_DEVNOTMBX  - указанный канал не назначен почтовому

                      ящику;

       SS$_INTERLOCK  - битовая карта для распределения  поч-

                      товых ящиков из  указанной  разделяемой

                      памяти заблокирована другим процессом;

       SS$_IVCHAN     - указан неверный номер канала, то есть

                      номер 0 или  номер  больший  чем  число

                      доступных каналов;




                           - 636 -

                        00152-01 97 06


       SS$_NOPRIV     - указанный канал не назначен устройст-

                      ву. Или процесс не имеет привилегии для

                      удаления постоянного  почтового  ящика.

                      Или режим доступа вызывающего  процесса

                      менее привилегированный, чем режим дос-

                      тупа процесса, назначившего канал.



       13.38. $DELPRC - удалить процесс


       Программа системного  обслуживания  $DELPRC  позволяет

  процессу удалять самого себя или другой процесс.

       Формат:

       SYS$DELPRC   [PIDADR],[PRCNAM]

       Аргументы:

       PIDADR

       Использование в МОС ВП: PROCESS_ID

       Тип:                    длинное слово (без знака)

       Доступ:                 модификация

       Механизм:               по ссылке

       Идентификатор процесса  (PID),  подлежащего  удалению.

  Аргумент PIDADR - это  адрес  длинного  слова,  содержащего

  PID.

       Аргумент PIDADR необходимо задавать для удаления  про-

  цессов из других групп UIC.











                           - 637 -

                        00152-01 97 06


       PRCNAM

       Использование в МОС ВП: PRCESS_NAME

       Тип:                    строка текста

       Доступ:                 только чтение

       Механизм:               по дескриптору - дескриптор

                               строки с фиксированной длиной

       Имя процесса, подлежащего удалению. Аргумент PRCNAM  -

  это адрес дескриптора символьной  строки,  указывающего  на

  строку имени процесса, содержащего от 1 до 15 символов.

       Аргумент PRCNAM можно использовать для удаления только

  тех процессов, которые принадлежат к одной и той же  группе

  UIC, что и вызывающий процесс. Причина этого заключается  в

  том, что имена процессов уникальны только в пределах группы

  UIC, и операционная система МОС ВП добавляет  номер  группы

  UIC вызывающего процесса к имени процесса, заданного  аргу-

  ментом PRCNAM.

       Для удаления процессов  в  других  группах  необходимо

  использовать аргумент PIDADR. .LIN 0  если  ни  PIDADR,  ни

  PRCNAM не указаны,  программа  $DELPRC  удаляет  вызывающий

  процесс; управление не возвращается.

       Описание.

       В зависимости от конкретной операции вызывающему  про-

  цессу могут потребоваться для использования $DELPRC опреде-

  ленные привилегии:

       1) привилегия GROUP требуется для удаления  процессов,

  принадлежащих к той же самой группе, но имеющих другой UIC;

       2) для удаления любого процесса в операционной системе




                           - 638 -

                        00152-01 97 06


  МОС ВП требуется привилегия WORLD.

       Программа системного  обслуживания  "удалить  процесс"

  требует системной динамической памяти.

       Для удаления подпроцессов уменьшаемые квоты  ресурсов,

  предоставленные этим подпроцессам, возвращаются  создавшему

  их процессу.

       Когда удаляется процесс или подпроцесс, то  создавшему

  его процессу посылается сообщение о завершении при условии,

  что почтовый ящик для получения этого сообщения еще сущест-

  вует и создающий процесс имеет доступ к  данному  почтовому

  ящику. Сообщение об окончании посылается прежде,  чем  ини-

  циируется окончательное свертывание; таким образом, создаю-

  щий процесс может получить сообщение о  завершении  раньше,

  чем выполнится удаление процесса.

       Вследствие сложности требуемых операций по свертыванию

  между запросом на удаление и фактическим удалением процесса

  проходит значительный интервал времени.  Однако,  программа

  системного обслуживания $DELPRC возвращает управление вызы-

  вающей программе сразу после инициации  операции  свертыва-

  ния.

       Если для процесса, который уже удаляется, выданы  пос-

  ледовательные запросы на удаление, то данные запросы  сразу

  же возвращают код успешного завершения.

       Полный список действий, выполняемых операционной  сис-

  темой МОС ВП при удалении процесса, приведен в  подразделах

  8.7 и 8.6.






                           - 639 -

                        00152-01 97 06


       Возвращаемые значения кода состояния:

       SS$_NORMAL   - успешное завершение;

       SS$_ACCVIO   - вызывающая программа не может прочитать

                    строку  имени  процесса  или   дескриптор

                    строки, либо она не может записать  иден-

                    тификатор процесса;

       SS$_INSFMEM  - для выполнения операции не хватает сис-

                    темной динамической памяти;

       SS$_NONEXPR  - предупреждение.  Указанный  процесс  не

                    существует, либо указан неверный  иденти-

                    фикатор процесса;

       SS$_NOPRIV   - вызывающий процесс не имеет привилегии,

                    требуемой для удаления указанного процес-

                    са.



       13.39. $DELTVA - удалить виртуальное  адресное

              пространство


       Программа системного обслуживания $DELTVA удаляет диа-

  пазон адресов из виртуального адресного  пространства  про-

  цесса. При успешном завершении данной  программы  удаленные

  страницы становятся недоступными, и обращение к ним  приво-

  дит к нарушению доступа.

       Формат:

       SYS$DELTVA   INADR,[RETADR],[ACMODE]

       Аргументы:

       INADR

       Использование в МОС ВП: ADDRESS_RANGE



                           - 640 -

                        00152-01 97 06


       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по ссылке

       Начальный  и  конечный  виртуальные  адреса  удаляемых

  страниц. Аргумент INADR - это адрес массива из двух длинных

  слов, содержащих по порядку начальный и конечный  виртуаль-

  ные адреса процесса. Если начальный виртуальный адрес такой

  же, как и конечный, то удаляется одна  страница.  В  каждом

  виртуальном адресе используется только  та  часть,  которая

  содержит номер виртуальной страницы; младшие 9 битов  игно-

  рируются.

       Программа  системного  обслуживания  $DELTVA   удаляет

  страницы, начиная с адреса, содержащегося во втором длинном

  слове аргумента INADR и кончая адресом, содержащимся в пер-

  вом длинном слове. Таким образом, если один и тот же массив

  используется и для программы системного обслуживания  "соз-

  дать виртуальное адресное пространство"  ($CRETVA),  и  для

  $DELTVA, то страницы удаляются в порядке, обратном тому,  в

  котором они создавались.

       RETADR

       Использование в МОС ВП: ADDRESS_RANGE

       Тип:                    длинное слово (без знака)

       Доступ:                 только запись

       Механизм:               по ссылке

       Начальный и конечный виртуальные адреса страниц, кото-

  рые были фактически удалены  программой  $DELTVA.  Аргумент

  RETADR является  адресом  массива  из  двух  длинных  слов,




                           - 641 -

                        00152-01 97 06


  содержащих начальный и конечный виртуальные адреса процесса

  соответственно.

       ACMODE

       Использование в МОС ВП: ACCESS_MODE

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Режим доступа, для которого должна  выполняться  прог-

  рамма системного обслуживания. Аргумент ACMODE - это  длин-

  ное слово, содержащее режим доступа.

       Более привилегированный режим, который может использо-

  ваться - это режим доступа вызывающего процесса. Вызывающий

  процесс может удалять только те страницы, которые принадле-

  жат режиму доступа, равному или  менее  привилегированному,

  чем режим доступа вызывающего процесса.

       Описание.

       Если какие-то страницы в указанном диапазоне уже  уда-

  лены или не существуют, то программа системного  обслужива-

  ния работает, как если бы данные страницы были успешно уда-

  лены.

       Если во время удаления страниц  возникает  ошибка,  то

  аргумент RETADR указывает страницы, которые успещно удалены

  до возникновения ошибки. Если  не  было  удалено  ни  одной

  страницы, то оба длинных слова в массиве возвращаемых адре-

  сов содержат значение минус 1.








                           - 642 -

                        00152-01 97 06


       Возвращаемые значения кода состояния:

       SS$_NORMAL      - успешное завершение;

       SS$_ACCVIO      - вызывающая программа не может прочи-

                       тать массив входных адресов,  либо  не

                       может  записать  массив   возвращаемых

                       адресов;

       SS$_NOPRIV      - страница, входящая в заданный диапа-

                       зон, находится  в  системном  адресном

                       пространстве;

       SS$_PAGEOWNVIO  - страница, входящая в заданный диапа-

                       зон, принадлежит более привилегирован-

                       ному режиму доступа, чем режим доступа

                       вызывающей программы.



       13.40. $DEQ - удалить  из  очереди  запрос  на

              захват


       Программа системного обслуживания $DEQ удаляет из оче-

  реди (освобождает) предоставленные захваты; удаляет из оче-

  реди подзахваты захвата; или отменяет невыполненный  запрос

  на захват. Вызывающий процесс должен прежде получить захват

  или поставить в очередь запрос на захват при помощи  вызова

  программы системного обслуживания "поставить в очередь зап-

  рос на захват" ($ENQ).

       Программы системного обслуживания  $DEQ,  $ENQ,  $ENQW

  (поставить в очередь запрос на захват и  ждать)  и  $GETLKI

  (получить информацию о захвате) в совокупности обеспечивают

  пользователю интерфейс со средством управления захватом мос



                           - 643 -

                        00152-01 97 06


  вп. Дополнительная информация об управлении захватом содер-

  жится в описаниях остальных из перечисленных программ.

       Формат:

       SYS$DEQ   [LKID][,VALBLK],[FLAGS]

       Аргументы:

       LKID

       Использование в МОС ВП: LOCK_ID

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Идентификатор захвата, который необходимо  удалить  из

  очереди.

       Если в аргументе FLAGS  задан  флаг  LCK$M_DEQALL,  то

  различные значения (или отсутствие значения) аргумента LKID

  определяют различные действия:

       1) если аргумент LKID не указан (или задан равным 0) и

  задан флаг LCK$M_DEQALL, то программа $DEQ удаляет из  оче-

  реди все захваты на все ресурсы, сделанные  данным  процес-

  сом, для всех режимов доступа, равных или менее привилегир-

  ванных, чем действующий режим  доступа.  Действующий  режим

  доступа - это меньший из режимов доступа  вызывающей  прог-

  раммы и режима доступа, заданного в аргументе ACMODE;

       2) если для аргумента LKID указано ненулевое  значение

  и задан флаг $LCN$M_DEQALL, то программа  $DEQ  удаляет  из

  очереди все подзахваты, принадлежащие  захвату,  указанному

  аргументом LKID; захват, указанный аргументом LKID, не уда-

  ляется из очереди. В данной операции программа $DEQ игнори-




                           - 644 -

                        00152-01 97 06


  рует флаг LCK$M_CANCEL, если он установлен. Подзахват - это

  захват, который был создан с указанием  аргумента  PARID  в

  вызове программы $ENQ, где PARID - идентификатор  порождаю-

  щего захвата.

       Если аргумент LKID опущен (или задан  равным  нулю)  и

  флаг LCK$M_DEQALL не установлен,  то  программа  системного

  обслуживания $DEQ возвращает код состояния "неверный  иден-

  тификатор захвата".

       VALBLK

       Использование в МОС ВП: LOCK_VALUE_BLOCK

       Тип:                    длинное слово (без знака)

       Доступ:                 модификация

       Механизм:               по ссылке

       Блок значений захвата для ресурса,  который  связан  с

  захватом, подлежащим удалению из очереди. Аргумент VALBLK -

  это адрес 16-байтового блока значений захвата. Данный аргу-

  мент не используется, если задан флаг LCK$M_DEQALL.

       Если из очереди удаляется захват с режимом  защищенной

  записи (PW) и с монопольным режимом  (EX),  и  в  аргументе

  VALBLK указан блок значений захвата, то содержимое  данного

  блока значений захвата переписывается в блок значений  зах-

  вата в базу данных захвата. Кроме того, если блок  значений

  захвата в базе данных захвата помечен как  недействителный,

  то данное условие снимается; данный блок становится  дейст-

  вительным.








                           - 645 -

                        00152-01 97 06


       ACMODE

       Использование в МОС ВП: ACCESS_MODE

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Режим доступа захвата, подлежащего удалению из  очере-

  ди. Аргумент ACMODE - это длинное слово,  содержащее  режим

  доступа.

       Макрокоманда $PSLDEF определяет  для  четырех  режимов

  доступа следующие обозначения:

            1) PSL$C_KERNEL - режим ядра;

            2) PSL$C_EXEC - режим управления;

            3) PSL$C_SUPER - супервизорный режим;

            4) PSL$C_USER - пользовательский режим.

       Режим доступа, который использует  программа  $DEQ,  -

  это наименее  привилегированный  режим  из  режима  доступа

  вызывающей программы и режима доступа, заданного аргументом

  ACMODE. Если аргумент ACMODE не задан,  то  программа  $DEQ

  использует режим доступа вызывающей программы.

       FLAGS

       Использование в МОС ВП: MASK_LONGWORD

       Тип:                    длинное слово (без знака)

       Д[5~уп:                 только чтение

       Механизм:               по значению

       Флаги, задающие возможности  операции  $DEQ.  Аргумент

  FLAGS - это битовая маска размером в длинное слово, которая

  является результатом операции "логическое или" над  набором




                           - 646 -

                        00152-01 97 06


  отдельных битов, где  каждый  бит  соответствует  некоторой

  возможности.

       Символическое имя для каждого бита флага  определяется

  при помощи макрокоманды $LCKDEF:

  LCK$M_DEQALL -

       когда указан данный флаг, программа  $DEQ  удаляет  из

       очереди несколько захватов в зависимости  от  значения

       аргумента LKID. Подробная информация содержится в опи-

       сании аргумента LKID. Если флаг LCK$M_DEQALL задан, то

       флаг LCK$M_CANCEL игнорируется, если он указан;

  LCK$M_CANCEL -

       когда задан данный флаг, то  программа  $DEQ  пытается

       отменить запросы на  преобразование  захвата,  которые

       были поставлены  в  очередь  программой  $ENQ.  Данная

       попытка может быть успешной только в том случае,  если

       запрос на захват еще не был удовлетворен  и,  следова-

       тельно, данный запрос находится в очереди запросов  на

       преобразование. Если задан флаг LCK$M_CANCEL, то  флаг

       LCK$M_DEAQALL     игнорируется.     Указание     флага

       LCK$M_CANCEL, может привести к следующим действиям:

       1) если запрос на преобразование подзахвата уже  удов-

       летворен, то  попытка  отменить  запрос  заканчивается

       ошибкой; в данном случае программа $DEQ  возвращает  в

       R0 код состояния SS$CANCELGRANT;

       2) если запрос на преобразование захвата еще не  удов-

       летворен, то программа $DEQ отменяет данный запрос.  В

       результате захват снова предоставляется с его  прежним




                           - 647 -

                        00152-01 97 06


       режимом захвата; программа $ENQ получает в  блок  сос-

       тояния захвата код состояния SS$_CANCEL,  а  служебная

       программа  $ENQ  возвращает   в   R0   код   состояния

       SS$NORMAL;

       3) если запрос на захват был не запросом на преобразо-

       вание захвата и, следовательно,  находится  в  очереди

       ожидающих запросов, то программа $DEQ отвергает запрос

       на захват. В результате программа системного  обслужи-

       вания $ENQ получает в блок состояния захвата код возв-

       рата SS$ABORT, а $DEQ возвращает в  R0  код  состояния

       SS$NORMAL;

  LCK$M_INVVABLK -

       когда задан данный флаг, программа $DEQ  помечает  как

       недействительный блок значений захвата,  который  под-

       держивается для данного ресурса в базе данных захвата.

       Данный блок значений захвата остается  помеченным  как

       недействительный до тех, пока он не будет снова  пере-

       записан. Данный флаг игнорируется, если:

       1) режим захвата, подлежащего удалению из очереди,  не

       является режимом  защищенной  записи  или  монопольным

       режимом;

       2) задан флаг LCK$M_CANCEL.

       Описание.

       Если из очереди удаляется захват с режимом  защищенной

  записи (PW) или с монопольным режимом (EX)  и  в  аргументе

  VALBLK указан блок значений захвата, то содержимое  данного

  блока значений захвата  перезаписывается  в  блок  значений




                           - 648 -

                        00152-01 97 06


  захвата в базу данных захвата.

       Если в аргументе FLAGS указан флаг LCK$M_INVVALBLK,  и

  удаляемый захват имеет режим PW или EX,  то  блок  значений

  захвата в базе данных помечается как недействительный неза-

  висимо от того, указан или  нет  блок  значений  захвата  в

  VALBLK.

       Возвращаемые значения кода состояния:

       SS$_NORMAL       - захват успешно удален из очереди;

       SS$_ACCVIO       - вызывающая программа не может полу-

                        чить доступ к блоку значений захвата,

                        заданному в аргументе VALBLK;

       SS$_IVLOCKID     - задан неверный  или  несуществующий

                        идентификатор захвата,  либо  процесс

                        не имеет  привилегии,  требуемой  для

                        удаления из очереди захвата с указан-

                        ным режимом доступа;

       SS$_SUBLOCKS     - захват имеет подзахваты и его нель-

                        зя удалить;

       SS$_CANCELGRANT  - в аргументе FLAGS  был  задан  флаг

                        LCK$M_CANCEL, но  запрос  на  захват,

                        который программа должна  была  отме-

                        нить, уже предоставлен.



       13.41. $DGBLSC - удалить глобальную секцию


       Программа $DGBLSC помечает для  удаления  существующую

  глобальную секцию. Фактическое удаление  глобальной  секции

  происходит, когда все процессы, которые отображали эту гло-



                           - 649 -

                        00152-01 97 06


  бальную секцию, удалят отображенные страницы.

       Формат:

       SYS$DGBLSC   [FLAGS],GSDNAM,[IDENT]

       Аргументы:

       FLAGS

       Использование в МОС ВП: MASK_LONGWORD

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Маска, определяющая характеристики глобальной  секции.

  Аргумнт FLAGS - это значение размером в длинное слово. Зна-

  чение 0 (принятое по умолчанию) задает групповую глобальную

  секцию; значение SEC$M_SYSGBL задает  системную  глобальную

  секцию.

       GSDNAM

       Использование в МОС ВП: SECTION_NAME

       Тип:                    строка текста

       Доступ:                 только чтение

       Механизм:               по дескриптору - дескриптор

                               строки с фиксированной длиной

       Имя удаляемой глобальной секции. Аргумент GSDNAM - это

  адрес дескриптора символьной строки, указывающего на строку

  данного имени.  Формат  строки  имени  описан  в  подпункте

  11.6.5.1.

       Для групповых глобальных секций  операционная  система

  МОС ВП интерпретирует групповой код идентификации пользова-

  теля (UIC) как часть имени глобальной секции;  таким  обра-




                           - 650 -

                        00152-01 97 06


  зом, данные имена глобальных секций  уникальны  для  группы

  UIC.

       IDENT

       Использование в МОС ВП: SECTION_ID

       Тип:                    квадрослово (без знака)

       Доступ:                 только чтение

       Механизм:               по ссылке

       Значение идентификации, которое определяет номер  вер-

  сии глобальной секции, подлежащей удалению, и  используемый

  критерий соответствия. Аргумент IDENT - это адрес структуры

  размером в квадрослово, содержащее три поля.

       Номер версии находится во втором длинном слове.  Номер

  версии содержит два поля: младшую идентификацию  в  младших

  24-х битах и старшую идентификацию в  старших  8-ми  битах.

  Значения данным полям можно  присвоить  путем  установления

  соглашения о различении версий глобальных секций. Если  при

  создании секции номер версии не указан, то процессы,  кото-

  рые при отображении задают номер версии секции,  не  смогут

  получить доступ к данной глобальной секции.

       Первое длинное слово в младших 3-х битах задает крите-

  рий соответствия. В табл.55 перечислены  допустимые  значе-

  ния, символические имена, при помощи которых можно задавать

  критерии, и их значения.












                           - 651 -

                        00152-01 97 06


                                                   Таблица 55

  -----------------------------------------------------------

  Значения !      Имя     !          Критерий

           !              !        соответствия

  -----------------------------------------------------------

    0      ! SEC$K_MATALL ! Соответствуют все версии данной

           !              ! секции

    1      ! SEC$K_MATEQU ! Соответствуют только те версии, у

           !              ! которых совпадает старшая и млад-

           !              ! шая идентификация

   2       ! SEC$K_MATLEQ ! Соответствуют те секции, у кото-

           !              ! рых старшая идентификация равна,

           !              ! а младшая идентификация, задан-

           !              ! ная отображающим процессом, мень-

           !              ! ше или равна младшей идентифика-

           !              ! ции данной глобальной секции


       Если адрес не указан или задан равным  0  (по  умолча-

  нию), то поля номера версии и управления критерием по умол-

  чанию принимаются равными 0.

       Описание.

       В зависимости от конкретной операции вызывающему  про-

  цессу для использования $DGBLSC могут потребоваться некото-

  рые привилегии:

       1) привилегия SYSGBL требуется для удаления  системной

  глобальной секции;

       2) привилегия PRMGBL требуется для удаления постоянной

  глобальной секции;



                           - 652 -

                        00152-01 97 06


       3) привилегия PFNMAP  требуется  для  удаления  секций

  физических страниц.

       После того, как глобальная секция помечена для  удале-

  ния, любой процесс, который попытается отобразить ее, полу-

  чит предупреждающий код возврата SS$_NOSUCHSEC.

       Временные глобальные секции  автоматически  удаляются,

  когда счетчик процессов,  использующих  секцию,  становится

  равным 0.

       Программа системного обслуживания $DGBLSC не выполняет

  операцию, обратную отображению  глобальной  секции  в  вир-

  туальное адресное  пространство  процесса.  Для  достижения

  данной цели процесс  должен  вызвать  программу  системного

  обслуживания "удалить  виртуальное  адресное  пространство"

  ($DELTVA), которая удаляет те  страницы,  на  которые  была

  отображена секция.

       Возвращаемые значения кода состояния:

       SS$_NORMAL      - успешное завершение;

       SS$_ACCVIO      - вызывающая программа не может прочи-

                       тать имя глобальной секции, или  деск-

                       риптор имени, или  поле  идентификации

                       секции;

       SS$_INTERLOCK   - захват битовой карты для распределе-

                       ния глобальной секции из заданной раз-

                       деляемой памяти уже сделан другим про-

                       цессом;

       SS$_IVLOGNAM    - имя глобальной секции имеет  нулевую

                       длину или длину более 15 символов;




                           - 653 -

                        00152-01 97 06


       SS$_IVSECFLG    - установлен    недопустимый     флаг,

                       резервный  флаг  или  флаг,  требующий

                       какой-то привилегии;

       SS$_IVSECIDCTL  - недопустимое поле  управления  соот-

                       ветствием в идентификации секции;

       SS$_NOPRIV      - вызывающий процесс не имеет привиле-

                       гии, необходимой для удаления  систем-

                       ной глобальной секции, не имеет досту-

                       па на чтение/запись групповой глобаль-

                       ной секции;

       SS$_NOSUCHSEC   - предупреждение. Указанная глобальная

                       секция не существует, либо  не  совпа-

                       дает по идентификации;

       SS$_NOTCREATOR  - секция, которая находится в  памяти,

                       разделяемой несколькими  процессорами,

                       была создана процессом, работающим  на

                       другом процессоре;

       SS$_SHMNOTCNCT  - разделяемая память, имя которой ука-

                       зано в  аргументе  GSDNAM,  неизвестна

                       системе. К этой ошибке может  привести

                       орфографическая   ошибка   в   строке,

                       неверно  присвоенное  логическое  имя,

                       либо ошибка, допущенная во время  сис-

                       темной генерации при определении памя-

                       ти как разделяемой;

       SS$_TOOMANYLNAM - трансляция  логического  имени   для

                       строки превысила  допустимую  глубину,




                           - 654 -

                        00152-01 97 06


                       равную 10.



       13.42. $DISMOU - демонтировать том


       Программа системного обслуживания $DISMOU  демонтирует

  смонтированный том или группу томов.

       Формат:

       SYS$DISMOU     DEVNAM,[FLAGS]

       Аргументы:

       DEVNAM

       Использование в МОС ВП: DEVICE_NAME

       Тип:                    строка текста

       Доступ:                 только чтение

       Механизм:               по дескриптору - дескриптор

                               строки фиксированной длины

       Имя устройства, которое демонтируется. Аргумент DEVNAM

  является адресом дескриптора строки символов,  указывающего

  на строку имени устройства. Данная строка может  быть  либо

  именем физического устройства, либо логическим именем. Если

  это логическое имя, то оно должно транслироваться  в  физи-

  ческое имя устройства.

       FLAGS

       Использование в МОС ВП: MASK_LONGWORD

       Тип:                    длинное слово (без знака)

       Доступ:                 только запись

       Механизм:               по значению

       Длинное слово вектора битов, задающих возможности мон-

  тирования. Аргумент FLAGS является длинным  словом  вектора



                           - 655 -

                        00152-01 97 06


  битов, в котором установленный бит выбирает соответствующую

  возможность. Каждый бит  имеет  символическое  имя.  Данные

  имена определяются макрокомандой $DMTDEF.

       Символические имена и их значения:

  DMT$M_ABORT -

       том должен быть  демонтирован,  даже  если  вызывающий

       процесс не монтировал данный том. Если том был смонти-

       рован с указанием  MNT$M_SHARE,  то  программа  $MOUNT

       демонтирует том для всех  пользователей,  которые  его

       монтировали;

       чтобы указать  флаг  DMT$M_ABORT,  вызывающий  процесс

  должен:

       1) иметь привилегию GRPNAM для группового тома;

       2) иметь привилегию SYSNAM для системного тома;

       3) либо владеть томом, либо иметь привилегию VOLPRO;

  DMT$M_NOUNLOAD -

       том не разгружается;

  DMT$M_UNIT -

       демонтируется указанное устройство из группы томов.

       Описание.

       В зависимости от операции использование $DISMOU  может

  потребовать от вызывающего  процесса  наличия  определенных

  привилегий:

       1) чтобы демонтировать том, смонтированный с  квалифи-

       катором /GRоUP, требуется привилегия GRPNAM;

       2) чтобы демонтировать том, смонтированный с  квалифи-

       катором /SYSTEM, требуется привилегия SYSNAM;




                           - 656 -

                        00152-01 97 06


       3) чтобы демонтирвать личный том,  вызывающий  процесс

       должен быть владельцем данного тома.

       Когда пользователь  вызывает  программу  $DISMOU,  она

  удаляет  том  из  пользовательского  списка  смонтированных

  томов, удаляет логическое имя, связанное с данным томом,  и

  уменьшает значение счетчика монтирований.

       Если счетчик монтирований после  уменьшения  достигает

  0, то программа $DISMOU помечает том для  демонтирования  и

  ожидает, когда том освободится, после чего выполняет демон-

  тирование.

       Если значение счетчика монтирований  после  уменьшения

  не достигает 0, то программа $DISMOU не  помечает  том  для

  демонтирования (так как том  должен  быть  смонтирован  как

  разделяемый). В данном случае общий эффект для  вызывающего

  процесса состоит в том, что он запрещает доступ  к  данному

  тому и удаляется элемент логического имени.

       Том, помеченный для демонтирования, реально не  демон-

  тируется до тех пор, пока не перейдет в  свободное  состоя-

  ние. Собственный том становится свободным,  когда  ни  один

  пользователь не имеет ни одного открытого файла  на  данном

  томе. Посторонний том становится свободным,  когда  нет  ни

  одного канала, назначенного данному тому.

       Собственные тома - это диски с файловой структурой или

  ленты со стандартными метками. Посторонние тома - это  дис-

  ки, не имеющие файловую структуру или ленты с нестандартны-

  ми метками.

       После того, как том реально демонтируется,  нестранич-




                           - 657 -

                        00152-01 97 06


  ный пул возвращается системе. Если же том был смонтирован с

  квалификаторами /GROUP или /SYSTEM, то страничный пул также

  возвращается.

       Если том  является  частью  группы  томов  с  файловой

  структурой, а битовый флаг  DMT$V_UNIT  не  установлен,  то

  демонтируется вся группа томов.

       Если том с файловой структурой помечен для  демонтиро-

  вания, то новые каналы к  нему  могут  назначаться,  однако

  новые файлы открыть нельзя.

       Код состояния SS$_NORMAL  индицирует  только  то,  что

  программа $DISMOU успешно выполнила один или более  описан-

  ных шагов; уменьшила значение счетчика монтирований,  поме-

  тила том для демонтирования или демонтировала том.  Единст-

  венный путь определить абсолютно точно, что  демонтирование

  реально произошло, состоит в  проверке  характеристик  уст-

  ройств с помощью программы системного  обслуживания  "полу-

  чить информацию об устройстве или томе".

       Указывая код элемента DVI$_DEVCHAR при вызове програм-

  мы системного обслуживания $GETDVI, можно выяснить, смонти-

  рован ли том (если установлен бит  DEV$V_MNT)  или  помечен

  для демонтирования (если установлен бит DEV$M_DMT).  Значе-

  ние  счетчика  монтирований  будет  равно  нулю,  если  бит

  DEV$V_MNT сброшен или установлен бит DEV$M_DMT.












                           - 658 -

                        00152-01 97 06


       Возвращаемые значения кода состояния:

       SS$_NORMAL      - программа  системного   обслуживания

                       успешно завершилась;

       SS$_ACCVIO      - вызывающий процесс не  может  прочи-

                       тать дескриптор имени устройства, либо

                       данный дескриптор не описывает  читае-

                       мое имя устройства;

       SS$_DEVALLOC    - устройство распределено другому про-

                       цессу и не  может  быть  демонтировано

                       вызывающим процессом;

       SS$_IVLOGNAM    - логическое  имя   устройства   имеет

                       нулевую длину или  длиннее  допустимой

                       длины логического имени;

       SS$_IVDEVNAM    - неверная строка имени устройства;

       SS$_NOGRPNAM    - для демонтирования  тома,  смонтиро-

                       ванного для использования  всей  груп-

                       пой, требуется привилегия GRPNAM;

       SS$_NOIOCHAN    - нет доступного канала  ввода-вывода.

                       Чтобы использовать  программу  $DISMOU

                       тому должен быть назначен канал;

       SS$_NONLOCAL    - предупреждение. Устройство находится

                       в удаленном узле;

       SS$_NOSUCHDEV   - указанного устройства не существует;

       SS$_NOSYSNAM    - для демонтирования  тома,  смонтиро-

                       ванного  для  общесистемного  доступа,

                       требуется привилегия SYSNAM;

       SS$_NOTFILEDEV  - указанное устройство не имеет файло-




                           - 659 -

                        00152-01 97 06


                       вой структуры;

       SS$_DEVOFFLINE  - указанное устройство недоступно;

       SS$_DEVNOTMOUNT - указанное устройство несмонтировано.



       13.43. $DLCEFC - удалить кластер общих  флагов

              событий


       Программа системного обслуживания $DLCEFC помечает для

  удаления постоянный кластер общих флагов  событий.  Кластер

  реально удаляется, когда больше нет связанных с ним процес-

  сов.

       Формат:

       SYS$DLCEFC     NAME

       Аргументы:

       NAME

       Использование в МОС ВП: EF_CLUSTER_NAME

       Тип:                    текстовая строка

       Доступ:                 только чтение

       Механизм                по дескриптору - дескриптор

                               строки фиксированной длины

       Имя кластера общих флагов событий, который должен быть

  удален. Аргумент NAME является адресом  дескриптора  строки

  символов, указывающего на имя кластера.

       Формат данного аргумента  описан  в  п.  4.7.1.  Имена

  кластеров флагов событий являются  уникальными  для  группы

  UIC, и  номер  группы  UIC  вызывающего  процесса  является

  частью данного имени.





                           - 660 -

                        00152-01 97 06


       Описание.

       Чтобы удалить общий кластер флагов событий, вызывающий

  процесс должен либо иметь привилегию PRMCEB, либо иметь тот

  же идентификатор UIC, что и процесс, создавший данный клас-

  тер.

       Программа системного обслуживания $DLCEFC не  отсоеди-

  няет кластер общих флагов событий, для  этого  используется

  программа системного обслуживания "отсоединить кластер общ-

  щих флагов событий" ($DLCEFC).  Однако  при  выходе  образа

  операционная система МОС ВП автоматически отсоединяет клас-

  тер общих флагов событий.

       Если кластер удален или не  существует,  то  программа

  системного обслуживания $DLCEFC  возвращает  код  состояния

  SS$_NORMAL.

       Возвращаемые значения кода состояния:

       SS$_NORMAL          - программа системного  обслужива-

                           ния успешно завершилась;

       SS$IVLOGNAM         - строка  имени   кластера   имеет

                           нулевую длину или ее длина  превы-

                           шает 15 символов;

       SS$_NOPRIV          - процесс не имеет нужной привиле-

                           гии для удаления постоянного клас-

                           тера общих флагов событий;












                           - 661 -

                        00152-01 97 06


       13.44. $ENQ - поставить в  очередь  запрос  на

              захват


       Программа системного обслуживания $ENQ ставит  в  оче-

  редь запрос на новый захват ресурса или  на  преобразование

  захвата.

       Программа  системного  обслуживания  $ENQ  выполняется

  асинхронно; то есть она  возвращает  управление  вызывающей

  программе после постановки в очередь запроса на захват,  не

  ожидая, чтобы данный захват был предоставлен или преобразо-

  ван.

       Для  синхронного  выполнения  необходимо  использовать

  программу системного обслуживания "поставить в  очередь  на

  захват и ждать" ($ENQW). Программа системного  обслуживания

  $ENQW во всем идентична программе  системного  обслуживания

  $ENQ за исключением того, что $ENQW  возвращает  управление

  вызывающей пограмме, когда захват предоставлен или преобра-

  зован.

       Дополнительная информация о завершении  программ  сис-

  темного обслуживания содержится в описании  программы  сис-

  темного обслуживания "синхронизировать" ($SYNCH) и  в  под-

  разделе 2.5.

       Программы системного обслуживания  $END,  $ENQW,  $DEQ

  (удалить из очереди запрос на захват)  и  GETLKI  (получить

  информацию о захвате) в совокупности обеспечивают пользова-

  тельский интерфейс к средству управления захватом  МОС  ВП.

  Дополнительная информация об управлении захватом содержится

  в описаниях остальных из перечисленных программ и в разделе



                           - 662 -

                        00152-01 97 06


  12.

       Формат:

       SYS$ENQ     [EFN],LKMODE,LKSB,[FLAGS],[RESNAM]

                   ,[PARID],[ASTADR],[ASTPRM],[BLKAST]

                   ,[ACMODE],NULLARG

       Аргументы:

       EFN

       Использование в МОС ВП: EF_NUMBER

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Номер флага события,  который  необходимо  установить,

  когда запрос на захват будет удовлетворен. Аргумент  EFN  -

  это длинное слово, содержащее данный номер.  При  инициации

  запроса программа $ENQ очищает указанный флаг события  (или

  флаг события 0, если EFN не указан). После того, как  будет

  удовлетворен запрос на захват, заданный флаг  события  (или

  флаг события 0) устанавливается, если не  был  указан  флаг

  LCK$M_SYNCSTS в аргументе FLAGS.

       LKMODE

       Использование в МОС ВП: LONGWORD_UNSIGNED

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Запрашиваемый режим захвата.  Аргумент  LKMODE  -  это

  длинное слово, задающее режим захвата.

       Каждый режим захвата имеет  сиволическое  имя.  Данные




                           - 663 -

                        00152-01 97 06


  символические  имена  определяют  при  помощи  макрокоманды

  $LCKDEF.

       Символические имена и описания режима:

  LCK$K_NLMODE -

       нулевой режим. Данный режим не предоставляет доступа к

       ресурсу, но занимает место и служит индикатором  буду-

       щего интереса к ресурсу. Нулевой режим не мешает  осу-

       ществлению захватов с другими режимами: более того, он

       предотвращает удаление ресурса и блока значений захва-

       та, которое в противном  случае  происходит,  если  из

       очереди удалены все захваты с другими режимами;

  LCK$K_CRMODE -

       совместное чтение. Данный режим предоставляет вызываю-

       щей программе доступ на чтение, позволяя в то же время

       другим  процессам  доступ  на  запись.  Данный   режим

       используется для чтения данных без  защиты,  поскольку

       другие пользователи могут модифицировать эти данные за

       то время, пока они  считываются.  Такой  режим  обычно

       используется  в  тех  случаях,  когда   осуществляется

       дополнительный захват уточняющими подзахватами;

  LCK$K_CWMODE -

       совместная запись. Данный режим предоставляет вызываю-

       щей программе доступ на запись, позволяя в то же время

       другим пользователям  осуществить  доступ  на  запись.

       Данный режим используется для записи данных без  защи-

       ты, поскольку одновременно другие  пользователи  могут

       записывать в ресурс. Такой режим обычно используется в




                           - 664 -

                        00152-01 97 06


       тех случаях, когда осуществляется дополнительный  зах-

       ват уточняющими подзахватами;

  LCK$K_PRMODE -

       защищенное чтение. Данный режим предоставляет вызываю-

       щей программе доступ к  ресурсу  на  чтение,  позволяя

       другим пользователям в то же время только читать. Дос-

       туп на запись запрещен;

  LCK$K_PWMODE -

       защищенная запись. Данный режим предоставляет вызываю-

       щей программе доступ к  ресурсу  на  запись,  позволяя

       другим пользователям в  это  же  время  только  читать

       ресурс; другим пользователям необходимо задавать режим

       доступа "совместное чтение". Никакие другие записываю-

       щие программы не получают доступа к данному ресурсу;

  LCK$K_EXMODE -

       монопольный  режим.  Монопольный  режим   предосталяет

       вызывающей программе доступ на запись в ресурс и  зап-

       Рещает доступ к ресурсу другим пользователям.

       LKSB

       Использование в МОС ВП: LOCK_STATUS_BLOCK

       Тип:                    длинное слово (без знака)

       Доступ:                 только запись

       Механизм:               по ссылке

       Блок состояния захвата, в который программа $ENQ запи-

  сывает окончательный код завершения операции. Аргумент LKSB

  - это адрес 8-байтового блока состояния захвата.

       Блок состояния  захвата  может  содержать  16-байтовый




                           - 665 -

                        00152-01 97 06


  блок значений захвата. Если в аргументе FLAGS  указан  флаг

  LCK$M_VALBLK, то блок состояния захвата содержит блок  зна-

  чений захвата; в данном случае  16-байтовый  блок  значений

  захвата размещается с первого байта, следующего за  восьмым

  байтом блока состояния захвата, увеличивая общую длину бло-

  ка состояния захвата до 24-х байтов.

       Рис. 58 показывает  формат  блока  состояния  захвата,

  включая необязательный блок значений захвата.


                 Формат блока состояния захвата

       31                       15                          0
       ------------------------------------------------------
       !   Зарезервировано      !     Код состояния МОС ВП  !
       ------------------------------------------------------
       !              Идентификатор захвата                 !
       ------------------------------------------------------
       !                                                    !
       !        16-байтовый блок значений захвата           !
       !                                                    !
       !     Используется только в том случае, если         !
       !     установлен флаг LCK$M_VALBLK                   !
       !                                                    !
       ------------------------------------------------------

                            Рис. 58

       Поля блока состояния захвата:

  код состояния -

       слово, в которое программа $ENQ записывает код состоя-

       ния МОС ВП, описывающий окончательное состояние запро-

       са на захват;

  зарезервировано -

       слово, которое не используется;

  идентификатор захвата -

       длинное слово, содержащее идентификатор  захвата.  Для

       нового захвата программа $ENQ записывает в это длинное



                           - 666 -

                        00152-01 97 06


       слово идентифкатор запрошенного захвата, когда  запрос

       на захват ставится в очередь.

       Для преобразования существующего захвата  пользователь

  должен поместить в  это  поле  идентификатор  существующего

  захвата:

  блок значений захвата -

       определяемая  пользователем   16-байтовая   структура,

       содержащая информацию  о  ресурсе.  Данную  информацию

       определяет и  интерпретирует  только  пользовательская

       программа.

       Когда процесс запрашивает захват на  ресурс,  средство

  управления захватом обеспечивает  данному  процессу  личную

  копию блока значений захвата,  связанного  с  ресурсом  при

  условии, что данный процесс указал в аргументе  FLAGS  флаг

  LCK$M_VALBLK.  Копия,  предоставляемая  процессу,  является

  копией блока значений захвата, хранящегося  в  базе  данных

  планировщика захватов.

       Копия блока значений захвата, хранящегося в базе  дан-

  ных, обновляется следующим образом: всякий раз, когда  про-

  цесс либо ставит в  очередь  захват  с  режимом  защищенной

  записи (PW) или с монопольным режимом (EX),  либо  преобра-

  зует захват с одним из этих режимов в захват с более низким

  режимом, вызывающего процесса в  базе  данных  захвата  при

  условии, что вызыващий процесс указал флаг LCK$M_VALBLK.

       Процессы, вызывающие  программу  $ENQ,  обеспечиваются

  копиями обновленного блока значений из базы данных  захвата

  следующим образом: когда программа $ENQ предоставляет вызы-




                           - 667 -

                        00152-01 97 06


  вающей программе новый захват или преобразует  в  захват  с

  более высоким режимом, то $ENQ  копирует  в  блок  значений

  захвата, принадлежащий вызывающей программе,  при  условии,

  что вызывающая программа указала флаг LCK$M_VALBLK.

       FLAGS

       Использование в МОС ВП: MASK_LONGWORD

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Флаги, задающие возможности для программы $ENQ.  Аргу-

  мент FLAGS - это битовая маска размером  в  длинное  слово,

  которая является результатом операции "логическое или"  над

  набором битов где каждый бит соответствует  некоторой  воз-

  можности.

       Макрокоманда $LCKDEF определяет символическое имя  для

  каждого битового флага:

  LCK$M_NOQUEUE -

       если указан данный флаг, программа $ENQ  не  ставит  в

       очередь запрос на захват, если захват нельзя  получить

       немедленно. По умолчанию программа $ENQ  всегда  будет

       ставить запрос  в  очередь.  Если  флаг  LCK$M_NOQUEUE

       задан в операции преобразования захвата и это преобра-

       зование нельзя выполнить сразу же, то захват  остается

       в первоначальном режиме захвата;

  LCK$M_SYNCSTS -

       если указан данный флаг, $ENQ возвращает в регистре R0

       код успешного завершения SS$_SYNCH если запрос на зах-




                           - 668 -

                        00152-01 97 06


       ват был удовлетворен сразу же; в данном случае AST  по

       выполнению не доставляется и флаг события не  устанав-

       ливается. Если запрос на  захват  успешно  ставится  в

       очередь, а не удовлетворяется сразу же, то $ENQ  возв-

       ращает в R0 код  состояния  SS$_NORMAL;  потом,  когда

       запрос будет удовлетворен, $ENQ установит флаг события

       и поставит в очередь AST, если указан аргумент ASTADR;

  LCK$M_SYSTEM -

       если был указан данный флаг, то имя ресурса  интерпре-

       тируется как общесистемное. По умолчанию имена  ресур-

       сов квалифицируются номером группы UIC создающего про-

       цесса. В преобразованиях захвата данный  флаг  игнори-

       руется;

  LCK$M_VALBLK -

       если указан данный флаг,  то  блок  состояния  захвата

       содержит блок значений захвата. Более подробная инфор-

       мация дана в описании аргумента LKSB;

  LCK$M_CONVERT -

       если указан данный флаг, $ENQ выполняет преобразование

       захвата. В данном случае вызывающая  программа  должна

       обеспечить (во втором длинном  слове  блока  состояний

       захвата) идентификатор захвата, подлежащего преобразо-

       ванию;

  LCK$M_NODLCKWT -

       задавая  данный  флаг,  процесс  сообщает   программам

       управления захватом, что он продолжает выполнение,  не

       ожидая, пока запрос на захват будет выполнен. Примером




                           - 669 -

                        00152-01 97 06


       этого является ситуация, в которой  запрос  на  захват

       оставляется неразрешенным в очереди ожидающих запросов

       как средство  сигнализации  между  процессами.  Данный

       флаг помогает предотвратить  ложные  мертвые  захваты,

       снабжая программы системного  обслуживания  управления

       захватом дополнительной информацией о процессе, выдав-

       шем запрос на захват.  Если  установлен  данный  флаг,

       программы системного обслуживания управления  захватом

       не рассматривают данный захват, когда пытаются опреде-

       лить условия мертвого захвата. Процесс должен задавать

       флаг LCK$M_NODLCKWT только в вызове программы  систем-

       ного обслуживания $ENQ. Программа системного  обслужи-

       вания $ENQW не возвращает управление вызывающей  прог-

       рамме, пока запрос на захват  не  будет  удовлетворен;

       следовательно, задание флага LCK$M_NODLCKWT  в  вызове

       программы системного обслуживания  $ENQW  противоречит

       назначению данного флага и будет игнорироваться истин-

       ный мертвый захват. Программы системного  обслуживания

       управления   захватом    могут    использовать    флаг

       LCK$M_NODLCKWT  только  в  том  случае,  если  захват,

       заданный в вызове $ENQ, находится либо в очереди  ожи-

       дающих захватов, либо  в  очереди  на  преобразование.

       Некорректное использование флага LCK$M_NODLCKWT  может

       привести к тому, что программы системного обслуживания

       управления захватом будут игнорировать истинные  мерт-

       вые захваты;






                           - 670 -

                        00152-01 97 06


  LCK$M_NODLCKBLK -

       задавая данный флаг, процесс сообщает программам  сис-

       темного обслуживания управления  захватом,  что,  если

       данный захват блокирует другой запрос  на  захват,  то

       процесс намерен уступить данный захват по  требованию.

       Если указан данный флаг, то программы системного  обс-

       луживания управления захватом блокируют другие  захва-

       ты, при попытке обнаружить условия  мертвого  захвата.

       Обычно процесс задает флаг  LCK$M_NODLCKBLK  только  в

       том случае, если он также задает AST по  захвату.  AST

       по захвату сообщают процессам, имеющим представление о

       том, что другой процесс с несовместимым режимом захва-

       та стоит в очереди на  получение  доступа  к  тому  же

       ресурсу. Использование AST по захвату может привести к

       ложным мертвым захватам, потому что программы  систем-

       ного  обслуживания  обнаруживают  ситуацию  блокировки

       даже если заданы AST по захвату; однако данная  ситуа-

       ция блокировки исчезнет  сразу,  как  только  процесс,

       задерживающий выполнение захвата, получит AST по  зах-

       вату и удалит свой захват из очереди.  Указание  флага

       LCK$M_NODLCKBLK предотвращает  ложный  мертвый  захват

       такого типа. Для задания AST аргумент BLKAST программы

       системного обслуживания $ENQ  должен  содержать  адрес

       подпрограммы обслуживания AST по захвату. Если процесс
       
       указывает флаг LCK$M_NODLCKBLK, то подпрограмма обслу-

       живания AST должна либо убрать из очереди данный  зах-

       ват, либо преобразовать его в захват  с  более  низким




                           - 671 -

                        00152-01 97 06


       режимом, не выдавая никаких запросов на новые захваты.

       если подпрограмма по захвату поступает иначе, то может

       получиться, что  будет  игнорирован  истинный  мертвый

       захват.  Программы  системного  обслуживания  захватом

       могут использовать флаг LCK$M_NODLCKBLK только  в  том

       случае, если захват, заданный в вызове программы $ENQ,

       уже  предоставлен.  Некорректное  использование  флага

       LCK$M_NODLCKBLK может привести к тому, что  программмы

       системного  обслуживания  управления  захватом   будут

       игнорировать истинные мертвые захваты;

  LCK$M_NOQUOTA -

       данный флаг зарезервирован.  Когда  установлен  данный

       флаг, вызывающему процессу для нового захвата не выде-

       ляется квота "предел постановки  в  очередь"  (ENQLM).

       Для того, чтобы задать флаг, вызывающий процесс должен

       работать в режиме управляющей программы или  в  режиме

       ядра. Для преобразования захвата флаг игнорируется;

  LCK$M_CVTSYS -

       данный флаг зарезервирован.  Когда  установлен  данный

       флаг, то данный захват преобразуется из захвата,  при-

       надлежащего процессу, в захват, принадлежащий системе.

       Для того, чтобы задать данный флаг, вызывающий процесс

       должен работать в режиме управляющей программы  или  в

       режиме ядра.










                           - 672 -

                        00152-01 97 06


       RESNAM

       Использование в МОС ВП: CHAR_STRING

       Тип:                    строка текста

       Доступ:                 только чтение

       Механизм:               по дескриптору - дескриптор

                               строки фиксированной длины

       Имя ресурса,  на  который  делается  захват.  Аргумент

  RESNAM - это адрес дескриптора символьной строки, указываю-

  щего на данное имя. Строка может иметь длину  от  1  до  31

  байта.

       Аргумент RESNAM требуется для новых захватов и игнори-

  руется для преобразования захвата.

       PARID

       Использование в МОС ВП: LOCK_ID

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Идентификатор порождающего захвата. Аргумент  PARID  -

  это длинное слово, содержащее данное значение идентификато-

  ра.

       Если данный аргумент не задан или равен 0, то програм-

  ма считает, что данный захват не имеет порождающего  захва-

  та. Данный аргумент является необязательным для новых  зах-

  ватов и игнорируется для преобразований захвата.










                           - 673 -

                        00152-01 97 06


       ASTADR

       Использование в МОС ВП: AST_PROCEDURE

       Тип:                    маска входа программы

       Доступ:                 вызов без развертывания стека

       Механизм:               по ссылке

       Подпрограмма обработки AST, которую необходимо  выпол-

  нить, когда захват будет предоставлен,  либо  преобразован.

  Аргумент ASTADR - это адрес маски входа данной  подпрограм-

  мы.

       Если задан арумент ASTADR, то подпрограмма  AST  будет

  выполняться в том же режиме доступа, что и процесс, вызвав-

  ший $ENQ.

       ASTPRM

       Использование в МОС ВП: USER_ARG

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Параметр AST, который  необходимо  передать  программе

  AST, заданной аргументом  ASTADR.  Аргумент  ASTADR  задает

  данный параметр размером в длинное слово.

       BLKAST

       Использование в МОС ВП: AST_PROCEDURE

       Тип:                    маска входа программы

       Доступ:                 вызов без развертывания стека

       Механизм:               по ссылке

       Подпрограмма AST по захвату, которая должна вызываться

  всякий раз, когда захват предоставлен  и  блокирует  другие




                           - 674 -

                        00152-01 97 06


  запросы на захват. Аргумент BLKAST - это адрес маски  входа

  данной подпрограммы.

       При помощи аргумента ASTPRM можно передать  какой-либо

  параметр этой программе.

       ACMODE

       Использование в МОС ВП: ACCESS_MODE

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Режим доступа, который будет связан с захватом.  Аргу-

  мент ACMODE - это длинное слово, содержащее режим доступа.

       Макрокоманда $PSLDEF определяет для  четырех  режимов-

  доступа следующие значения:

  PSL$C_KERNEL -

       режим ядра;

  PSL$C_EXEC -

       режим управления;

  PSL$C_SUPER -

       супервизорный режим;

  PSL$C_USER -

       пользовательский режим.

       Программа системного обслуживания $ENQ назначает  зах-

  вату режим доступа следующим образом:

       1) если  был  указан  порождающий  захват  (аргументом

       PARID), то $ENQ использует режим доступа, связанный  с

       порождающим  захватом,  и  игнорируется  как  аргумент

       ACMODE, так и режим доступа вызывающего процесса;




                           - 675 -

                        00152-01 97 06


       2) если захват не имеет порождающего захвата (аргумент

       PARID не задан или равен 0), то $ENQ использует наиме-

       нее привилегированный режим из режима доступа вызываю-

       щего процесса и режима доступа,  заданного  аргументом

       ACMODE. Если аргумент ACMODE не задан, то $ENQ исполь-

       зует режим доступа вызывающей программы.

       NULLARG

       Использование в МОС ВП: NULL_ARG

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Данный аргумент зарезервирован.

       Описание.

       Для того, чтобы поставить в очередь запрос на общесис-

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

  легию SYSLCK, либо выполняться в режиме  управляющей  прог-

  раммы или в режиме ядра.

       Задавать порождающий захват при постановке  в  очередь

  некоторого захвата можно только в том  случае,  если  режим

  доступа, связанный с порождающим захватом, имеет равную или

  меньшую привилегию, чем режим доступа вызывающего процесса.

       Ставить в очередь  запрос  на  преобразование  захвата

  можно только в том случае, если режим доступа, связанный  с

  захватом, подлежащим преобразованию, имеет равную или мень-

  шую привилегию, чем режим доступа вызывающего процесса.








                           - 676 -

                        00152-01 97 06


       $ENQ использует следующие системные ресурсы:

       1) программа системного обслуживания  $ENQ  использует

       квоту "предел на постановку в очередь" (ENQLM);

       1)  программа  системного  обслуживания   $ENQ   может

       использовать квоту "предел AST" (ASTLM) в запросах  на

       преобразование захвата, которые задают аргумент ASTADR

       или BLKAST;

       3) для создания блоков захвата ресурса требуется  сис-

       темная динамическая память.

       Когда программа $ENQ ставит в очередь запрос  на  зах-

  ват, она возвращает в регистре R0 код состояния  и  записы-

  вает идентификатор захвата в блок состояния захвата. Потом,

  когда запрос на захват удовлетворен, $ENQ записывает  окон-

  чательный код состояния в блок состояния захвата,  устанав-

  ливает флаг события и вызывает подпрограмму AST,  если  она

  была запрошена.

       В некоторых  ситуациях  блок  значений  захвата  может

  стать недействительным. Программа $ENQ предупреждает  вызы-

  вающий процесс о таких ситуациях, возвращая в блок  состоя-

  ния SS$_VALNOTVALID при  условии,  что  вызывающий  процесс

  указал в аргументе FLAGS флаг LCK$M_VALBLK.

       Код состояния SS$_VALNOTVALID является предупреждением

  об ошибке. Программа  системного  обслуживания  $ENQ  будет

  продолжать предоставлять запросы на захват несмотря на  то,

  что она вернула код  состояния  SS$_VALNOTVALID.  Программа

  $ENQ будет возвращать данное предупреждение и при всех пос-

  ледующих вызовах $ENQ до тех пор, пока в базу данных захва-




                           - 677 -

                        00152-01 97 06


  та не будет записан новый блок значений захвата,  или  пока

  ресурс не будет удален. Удаление ресурса происходит  в  том

  случае, когда не остается ни одного захвата,  связанного  с

  этим ресурсом.

       Блок значений захвата может стать  недействительным  в

  результате следующих действий:

       1) если какой-нибудь процесс, имеющий захват на ресурс

       с режимом защищенной записи или с монопольным режимом,

       заканчивается аварийно, то блок значений данного  зах-

       вата становится недействительным;

       2) если процесс, имеющий захват на  ресурс  с  режимом

       защищенной записи или с монопольным режимом,  вызывает

       программу системного обслуживания "удалить из  очереди

       запрос на захват" ($DEQ) для того, чтобы удалить  дан-

       ный захват из очереди, и задает в арументе FLAGS  флаг

       LCK$M_INVVALBLK, то блок значений захвата в базе  дан-

       ных захвата, помечается как недействительный.

       Возвращаемые значения кода состояния:

       SS$_NORMAL       - успешное завершение. Запрос на зах-

                        ват успешно поставлен в очередь;

       SS$_SYNCH        - успешное  завершение.  В  аргументе

                        FLAGS был указан флаг LCK$M_SYNCSTS и

                        $ENQ может  удовлетворить  запрос  на

                        очередь немедленно;

       SS$_ACCVIO       - нельзя прочитать блок состония зах-

                        вата или имя ресурса;

       SS$_BADPARAM     - в аргументе LKMODE  задан  неверный




                           - 678 -

                        00152-01 97 06


                        режим захвата;

       SS$_CVTUNGRANT   - попытка преобразовать захват, кото-

                        рый еще не предоставлен;

       SS$_EXDEPTH      - превышен предел  уровней  подзахва-

                        тов;

       SS$_EXENQLM      - процесс превысил свою квоту "предел

                        на постановку в очередь" (ENQLM);

       SS$_INSFMEM      - недостаточно системной динамической

                        памяти для создания требуемых  струк-

                        тур данных;

       SS$_IVBUFLEN     - длина имени  ресурса  равна  0  или

                        больше 31;

       SS$_IVLOCKID     - задан неверный  или  несуществующий

                        идентификатор захвата, либо  захвату,

                        найденному по  этому  идентификатору,

                        соответствует более привилегированный

                        по сравнению с  вызывающим  процессом

                        режим доступа;

       SS$_NOLOCKID     - в  запросе  на  захват  отсутствует

                        идентификатор захвата;

       SS$_NOTQUEUED    - запрос на захват поставлен  в  оче-

                        редь; в аргументе  FLAGS  был  указан

                        флаг LCK$M_NOQUEUE, а $ENQ  не  может

                        удовлетворить запрос на захват  сразу

                        же;

       SS$_NOSYSLCK     - в аргументе FLAGS  был  задан  флаг

                        LCK$M_SYSTEM, но  вызывающий  процесс




                           - 679 -

                        00152-01 97 06


                        не имеет требуемой привилегии SYSLCK;

       SS$_PARNOTGRANT  - порождающий  захват,  указанный   в

                        аргументе PARID, не был предоставлен.

       Значения кода состония, возвращаемые в блоке захвата:

       SS$_NORMAL       - успешное завершение. Захват успешно

                        предоставлен или преобразован;

       SS$_ABORT        - захват был удален из очереди (прог-

                        раммой $DEQ) раньше, чем $ENQ  смогла

                        предоставить данный захват;

       SS$_DEADLOCK     - обнаружен мертвый захват;

       SS$_CANCEL       - запрос  на  преобразование  захвата

                        отменен, а захват был  снова  предос-

                        тавлен с его прежним режимом захвата.

                        Данный  код  состояния  возвращается,

                        когда $ENQ ставит в очередь запрос на

                        преобразование захвата, данный запрос

                        еще не был удовлетворен (он находится

                        в очереди на преобразование), а в это

                        время программа системного обслужива-

                        ния $ENQ вызвана (с  указанием  флага

                        LCK$M_CANCEL) для отмены данного зап-

                        роса на преобразование.  Если  захват

                        был  предоставлен  раньше,  чем  $DEQ

                        смогла отменить запрос на  преобразо-

                        вание, то вызов программы $DEQ  полу-

                        чит код возврата  SS$_CANCELGRANT,  а

                        вызов $ENQ - код SS$_NORMAL;




                           - 680 -

                        00152-01 97 06


       SS$_VALNOTVALID  - блок значений захвата  помечен  как

                        недействительный.  Данное  предупреж-

                        дающее сообщение возвращается  только

                        в том случае, если вызывающий процесс

                        указал флаг LCK$M_VALBLK в  аргументе

                        FLAGS. Захват будет  успешно  предос-

                        тавлен, несмотря на  возврат  данного

                        предупреждающего сообщения.



       13.45. $ENQW - поставить в очередь  запрос  на

              захват и ждать


       Программа системного обслуживания $ENQW ставит в  оче-

  редь запрос на захват ресурса.

       Программа системного  обслуживания  $ENQW  выполняется

  синхронно, то есть  она  возвращает  управление  вызывающей

  программе, когда захват уже предоставлен или преобразован.

       Для асинхронного выполнения следует использовать прог-

  рамму системного обслуживания "поставить в  очередь  запрос

  на захват" ($ENQ); $ENQ  возвращает  управление  вызывающей

  программе, не ожидая, когда данный захват будет  предостав-

  лен или преобразован.

       Во всех  других  аспектах  программа  $ENQW  идентична

  $ENQ. Всю остальную информацию о программе системного  обс-

  луживания $ENQ можно получить из описания $ENQ.  (см.  под-

  раздел 2.5).

       Программы системного обслуживания  $ENQ,  $ENQW,  $DEQ

  (удалить из очереди запрос на захват) и  $GETLKI  (получить



                           - 681 -

                        00152-01 97 06


  информацию о захвате) в совокупности обеспечивают пользова-

  телю интерфейс со средством управления захватом МОС ВП.

       Формат:

       SYS$ENQW     [EFN],LKMODE,LKSB,[FLAGS],[RESNAM]

                    ,[PARID],[ASTADR],[ASTPRM],[BLKAST]

                    ,[ACMODE],NULLARG



       13.46. $ERAPAT  -  получить  шаблон   стирания

              секретных данных


       Программа системного обслуживания $ERAPAT  генерирует-

  шаблон стирания сеекетных данных. Программа стирания, напи-

  санная пользователем, может затем записать данный шаблон  в

  области памяти, содержащие важные данные, которые больше не

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

  данных.

       Формат:

       SYS$ERAPAT    [TYPE],[COUT],[PATADR]

       Аргументы:

       TYPE

       Использование в МОС ВП: LONGWORD_UNSIGNED

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Тип памяти, на  которую  записывают  шаблон  стирания.

  Аргумент TYPE является длинным словом, содержащим тип памя-

  ти.





                           - 682 -

                        00152-01 97 06


       Типы памяти и  их  символические  имена  (определяемые

  макрокомандой $ERADEF):

  основная память -

       ERA$K_MEMORY;

  диск -

       ERA$K_DISK;

  магнитная лента -

       ERA$K_TAPE.

       COUNT

       Использование в МОС ВП: LONGWORD_UNSIGNED

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Число раз,  которое  программа  $ERAPAT  вызывается  в

  одной операции стирания. Аргумент  секретных  данных  COUNT

  является длинным словом, содержащим счетчик итераций.

       Программу  системного  обслуживания  $ERAPAT   следует

  вызывать в первый раз с аргументом COUNT равным 1, во  вто-

  рой раз - с аргументом COUNT равным 2 и так далее, пока  не

  будет возвращен код состония SS$_NOTRAN.

       PATADR

       Использование в МОС ВП: LONGWORD_UNSIGNED

       Тип:                    длинное слово (без знака)

       Доступ:                 только запись

       Механизм:               по ссылке

       Шаблон стирания секретных данных, который должен запи-

  сываться в нужную область памяти. Аргумент PATADR  является




                           - 683 -

                        00152-01 97 06


  адресом длинного слова, в которое должен записываться  шаб-

  лон стирания секретных данных.

       Описание.

       Программа $ERAPAT обеспечивает механизм стирания  сек-

  ретных данных. Она обычно используется операционной  систе-

  мой МОС ВП, но может быть применена и использована для сти-

  рания информации на пользовательских дисках.

       Программу  системного  обслуживания  $ERAPAT   следует

  вызывать итеративно, пока не будет возвращен код  состояния

  SS$_NOTRAN.

       Возвращаемые значения кода состояния:

       SS$_NORMAL   - успешное завершение, продолжить следую-

                    щий шаг стирания;

       SS$_NOTRAN   - успешное завершение, защитное  стирание

                    закончено;

       SS$_BADPARAM - неверный аргумент TYPE или COUNT;

       SS$_ACCVIO   - вызывающий процесс  не  может  записать

                    аргумент PATADR.

       Пример.

       ; фрагмент кода, который стирает 20 блоков (блоки с 15

       ; по 34) на диске

       PATTERN:

               .LONG    0                 ;ячейка, которая

                                          ;должна содержать

                                          ;выходную информа-

                                          ;цию $ERAPAT

              .




                           - 684 -

                        00152-01 97 06


              .

              .

               MOVL     #1, R2            ;установить началь-

                                          ;ное значение счет-

                                          ;чика

               $ERADEF                    ;макрокоманда для

                                          ;определения имен

                                          ;используемых про-

                                          ;граммой $ERAPAT

       10$:    $ERAPAT_S                  ;вызвать программу

                       COUNT=R2,-         $;ERAPAT

                       TYPE=#ERA$K_DISK,- ;

                       PATADR=PATTERN

               BLBC    R0, EXIT           ;перейти при ошибке

               CMPL    #SS$_NOTRAN, R0    ;закончили?

               BEQL    EXIT               ;перейти, если да

               $QIO_S  FUNC=#10$_WRITELBLK!I0$M_ERASE,-  ;

                       P1=PATTERN,-       ;вызвать программу

                       P2=#<20*512>,-     ;системного обслу-

                       P3=#15             ;живания $QIO,

                                          ;чтобы записать

                                          ;шаблон защитного

                                          ;стирания в память

               INCL    R2                 ;увеличить значение

                                          ;счетчика

               BRB     10$

       EXIT:




                           - 685 -

                        00152-01 97 06


              .

              .

              .

       Данный пример демонстрирует, как использовать програм-

  му системного обслуживания $ERAPAT для выполнения  стирания

  секретных данных на диске. После каждого  вызова  программы

  $ERAPAT выполняется контроль на код  состояния  SS$_NOTRAN.

  Если данный код не возвращается,  то  вызывается  программа

  $QIO для записи на диск образца,  возвращаемого  программой

  $ERAPAT. После этой  записи  программа  $ERAPAT  вызывается

  снова и цикл  повторяется,  пока  не  будет  возвращен  код

  SS$_NOTRAN.



       13.47. $EXIT - выход


       Программа системного обслуживания  $EXIT  используется

  операционной системой для свертывания образа, когда текущий

  образ в процессе заканчивает выполнение. Обычно  управление

  передается интерпретатору команд.

       Формат:

       SYS$EXIT   [CODE]

       Аргументы:

       CODE

       Использование в МОС ВП: COND_VALUE

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению





                           - 686 -

                        00152-01 97 06


       Значение размером в длинное слово, которое нужно  сох-

  ранить в заголовке процесса  как  код  завершения  текущего

  образа. Если в вызове аргумент не задан, то для языков  МОС

  ВП макроассемблер и блисс передается значение 1, а для дру-

  гих языков передается значение  0.  Данное  значение  можно

  проверять на уровне  команд,  чтобы  обеспечить  выполнение

  команды по условию.

       Описание.

       Программа системного обслуживания $EXIT не  похожа  на

  все программы системного обслуживания в том смысле, что она

  не возвращает код состояния ни в регистре R0,  ни  как-либо

  иначе. Программа системного обслуживания $EXIT  не  возвра-

  щает управление вызывающей программе; она организует  выход

  в интерпретатор, а, если он отсутствует, то процесс  завер-

  шается (см. Подраздел 8.6).

       Возвращаемые значения кода состояния:

       Нет.



       13.48. $EXPREG - расширить  область  программы

              или область управления


       Программа системного  обслуживания  $EXPREG  добавляет

  заданное количество новых  виртуальных  страниц  к  области

  программы или к области управления процесса для  выполнения

  текущего образа. Расширение осуществляется от текущего кон-

  ца виртуального адресного пространства данной области.







                           - 687 -

                        00152-01 97 06


       Формат:

       SYS$EXPREG     PAGCNT,[RETADR],[ACMODE],[REGION]

       Аргументы:

       PAGCNT

       Использование в МОС ВП: LONGWORD_UNSIGNED

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Количество  страниц,  которые  необходимо  добавить  к

  области программы или к области управления. Аргумент PAGCNT

  - это длинное слово, содержащее данное количество.

       RETADR

       Использование в МОС ВП: ADDRESS_RANGE

       Тип:                    длинное слово (без знака)

       Доступ:                 только запись

       Механизм:               по ссылке

       Начальный и конечный виртуальные адреса страниц,  фак-

  тически добавленных программой $EXPREG. Аргумент  RETADR  -

  это адрес массива из  двух  длинных  слов,  содержащего  по

  порядку начальный и конечный виртуальные адреса процесса.

       ACMODE

       Использование в МОС ВП: ACCESS_MODE

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Режим доступа, связанный с вновь добавленными  страни-

  цами. Аргумент ACMODE - это длинное слово, содержащее режим




                           - 688 -

                        00152-01 97 06


  доступа.

       Наиболее  привилегированный  режим  доступа,   который

  может использоваться - это режим доступа  вызывающего  про-

  цесса.

       Вновь добавленным страницам дается следующая защита:

       1) разрешен доступ на чтение и запись для режимов дос-

       тупа с равной или большей привилегией, чем режим  дос-

       тупа, используемый в вызове;

       2) доступ запрещен для режимов, менее  привилегирован-

       ных, чем режим доступа, используемый в вызове.

       REGION

       Использование в МОС ВП: LONGWORD_UNSIGNED

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Номер, определяющий, какую область программы необходи-

  мо расширить. Аргумент REGION -  это  значение  размером  в

  длинное слово. Значение 0 (принимаемое по умолчанию) указы-

  вает,   что   необходимо   расширить   область    программы

  (P0-область). Значение 1 указывает, что  необходимо  расши-

  рить область управления (P1-область).

       Описание.

       Квота файла обмена страниц (PGFLQUOTA) процесса должна

  быть достаточной для увеличения размера виртуального адрес-

  ного пространства.

       Новые страницы, которые были ранее недоступны  процес-

  су, создаются как обнуляемые при загрузке страницы.




                           - 689 -

                        00152-01 97 06


       Поскольку пользовательский стек обычно  размещается  в

  конце области  управления,  расширение  области  управления

  эквивалентно  расширению  пользовательского  стека.  Эффект

  заключается в увеличении доступного пространства  стека  на

  заданное число страниц.

       Возвращаемый начальный адрес - это всегда первая  дос-

  тупная страница в указанной области; следовательно,  конеч-

  ный адрес меньше, чем  начальный  адрес,  если  расширяется

  область управления, и больше,  чем  начальный  адрес,  если

  расширяется область программы.

       Если во время добавления страниц возникает ошибка,  то

  аргумент RETADR (если он задан) указывает страницы, которые

  были успешно добавлены до  возникновения  ошибки.  Если  ни

  одной страницы не было  добавлено,  то  оба  длинных  слова

  аргумента RETADR содержат минус 1.

       Информацию, возвращаемую по адресу, заданному аргумен-

  том RETADR (если он указан), можно использовать как  диапа-

  зон входных адресов для программы  системного  обслуживания

  "удалить виртуальное адресное пространство" ($DELTVA).

       Возвращаемые значения кода состояния:

       SS$_NORMAL     - успешное завершение;

       SS$_ACCVIO     - вызывающая программа не  может  запи-

                      сать массив возвращаемых адресов;

       SS$_EXQUOTA    - процесс  превысил  свою  квоту  файла

                      обмена страниц;

       SS$_ILLPAGCNT  - заданное количество страниц меньше 1;

       SS$_INSFWSL    - предел рабочего набора  процесса  мал




                           - 690 -

                        00152-01 97 06


                      для увеличившегося виртуального  адрес-

                      ного пространства;

       SS$_VASFULL    - виртуальное   адресное   пространство

                      процесса переполнено. В таблице страниц

                      процесса  нет  места  для   запрошенных

                      областей.



       13.49. $FAO - форматировать вход


       Программа системного обслуживания $FAO выполняет  сле-

  дующие действия:

       1)  преобразовывает  двоичное  значение  в  символьную

  строку в  десятичной,  шестнадцатиричной  или  восьмеричной

  нотации и возвращает строку символов  в  качестве  выходной

  строки;

       2) вводит переменные данные в виде символьной строки в

  выходную строку.

       Программа системного обслуживания "форматировать  вход

  со списком параметров" ($FAOL) обеспечивает  альтернативный

  способ специфицировать входные параметры для  вызова  прог-

  раммы системного обслуживания $FAO.

       Формат:

       SYS$FAO     CTRSTR,[OUTLEN],OUTBUF,[P1]...[PN]

       SYS$FAOL    CTRSTR,[OUTLEN],OUTBUF[,PRMLST]











                           - 691 -

                        00152-01 97 06


       Аргументы:

       CTRSTR

       Использование в МОС ВП: CHAR_STRING

       Тип:                    текстовая строка

       Доступ:                 только чтение

       Механизм:               по дескриптору - дескриптор

                               строки фиксированной длины

       Управляющая строка, передаваемая программе $FAO. Аргу-

  мент CTRSTR является адресом дескриптора  строки  символов,

  указывающего  на  управляющую  строку.  Управляющая  строка

  содержит текст, который должен выводиться с одной или более

  директив FAO.

       Нет ограничений ни на  длину  управляющей  строки,  ни

  число директив FAO, которые  она  может  содержать.  Однако

  если в выходной строке должен присутствовать  восклицатель-

  ный знак (!), то в управляющей строке он должен быть предс-

  тавлен двумя восклицательными знаками (!!). Один  восклица-

  тельный знак в управлящей строке указывает программе  $FAO,

  что следующие символы должны интерпретироваться как  дирек-

  тивы $FAO.

       Когда программа $FAO обрабатывает управляющую  строку,

  она пишет каждый символ, который не является частью  дирек-

  тивы FAO, в выходной буфер. Когда программа встречает воск-

  лицательный знак, то она интерпретирует  следующие  символы

  как директиву FAO.

       Если директива правильная, то программа $FAO обрабаты-

  вает ее. Если директива  требует  параметра,  то  программа




                           - 692 -

                        00152-01 97 06


  обрабатывает следующий параметр в указанном списке парамет-

  ров. Если директива FAO ошибочная, то программа $FAO завер-

  шается и возвращает в регистре R0 значение кода состояния.

       Программа системного обслуживания $FAO читает парамет-

  ры из списка аргументов, указанных  при  вызове  программы.

  Данные аргументы имеют имена P1, P2, P3 и т.д. До P20. Каж-

  дый аргумент задает один параметр. Поскольку программа $FAO

  принимает максимум 20 параметров в одном вызове, то в  слу-

  чае, если число параметров превышает эту величину,  необхо-

  димо использовать  программу  $FAOL.  Программа  системного

  обслуживания  $FAOL  принимает  любое   число   параметров,

  используя аргумент PRMLST (список параметров).

       OUTLEN

       Использование в МОС ВП: WORD_UNSIGNED

       Тип:                    слово (без знака)

       Доступ:                 только запись

       Механизм:               по ссылке

       Длина в байтах полностью форматированной строки, возв-

  ращаемой программой $FAO. Аргумент OUTLEN является  адресом

  слова, содержащего это значение.

       OUTBUF

       Использование в МОС ВП: CHAR_STRING

       Тип:                    текстовая строка

       Доступ:                 только запись

       Механизм:               по дескриптору - дескриптор

                               строки фиксированной длины

       Выходной буфер, в который программа  $FAO  пишет  пол-




                           - 693 -

                        00152-01 97 06


  ностью форматированную  выходную  строку.  Аргумент  OUTBUF

  является адресом дескриптора строки символов,  указывающего

  на выходной буфер.

       С P1 по PN

       Использование в МОС ВП: VARYING_ARG

       Тип:                    длинное слово (со знаком)

       Доступ:                 только чтение

       Механизм:               по значению

       Параметр (или параметры) директивы  FAO.  Аргумент  P1

  является длинным словом, содержащим параметр, который  тре-

  буется первой директиве FAO,  встретившейся  в  управляющей

  строке; аргумент  P2  является  динным  словом,  содержащим

  параметр, который требуется второй директиве FAO и т.д. Для

  остальных аргументов до P20  включительно.  Если  директива

  FAO не трубует параметра, то она обрабатывается без  чтения

  параметра из списка аргументов.

       В зависимости от директивы параметр может быть  значе-

  нием, которое  должно  преобразовываться,  адресом  строки,

  которая должна вводиться в выходную строку, или длиной  или

  счетчиком аргументов. Каждая директива в управляющей строке

  может требовать соответствующего параметра или параметров.

       PRMLST

       Использование в МОС ВП: VECTOR_LONGWORD_UNSIGNED

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по ссылке

       Список параметров  директив  FAO,  которые  передаются




                           - 694 -

                        00152-01 97 06


  программе системного  обслуживания  $FAO.  Аргумент  PRMLST

  является адресом списка  длинных  слов,  в  котором  каждое

  длинное слово представляет параметр. Программа $FAOL  обра-

  батывает данные параметры последовательно по мере того, как

  в управляющей строке встречаются директивы  FAO,  требующие

  параметров.

       Список параметров может быть структурой данных,  кото-

  рая уже существут в программе и из  которой  должны  извле-

  каться определенные значения.

       Описание.

       Форма макрокоманды $FAO_S использует инструкцию  PUSHL

  для всех параметров (с P1 по  PN),  передаваемых  программе

  системного обслуживания. Если указан  символический  адрес,

  то ему должен предшествовать символ номера (#) или он  дол-

  жен загружаться в регистр.

       Для макрокоманды $FAO можно указать максимум 20  пара-

  метров. Если требуется  более  20  параметров,  то  следует

  использовать макрокоманду $FAOL.

       Эта программа  системного  обслуживания  не  проверяет

  длину списка аргументов, и, следовательно, не может вернуть

  ошибочный код состояния SS$_INSFARG (недостаточно  аргумен-

  тов). Если программа системного  обслуживания  не  получает

  достаточно аргументов (например, при вызове программы  опу-

  щена требуемая запятая), то результат может быть непредска-

  зуемым.








                           - 695 -

                        00152-01 97 06


       Формат директив FAO

       Директива FAO может появиться в любом месте  управляю-

  щей строки. Общий формат директив FAO имеет следующий вид:

            !DD

       Восклицательный знак (!) указывает, что следующие сим-

  волы должны интерпретироваться как директива FAO, а символы

  "DD" представляют одно или двух символьную  директиву  FAO.

  Если символы в директиве FAO алфавитные, то они должны быть

  заглавными буквами.

       Директива FAO может задавать следующие поля:

       1) счетчик повторений, который имеет следующий формат:

            !N(DD)

       В данном случае "N" - это десятичное число,  указываю-

  щее, сколько раз программа $FAO должна повторить  указанную

  в скобках директиву. Если директива требует параметра  (или

  параметров), то  программа  $FAO  использует  параметры  из

  списка параметров для каждого повторения  директивы.  Прог-

  рамма не использует один и тот же параметр (или  параметры)

  для каждого повторения. Скобки обязательны;

       2) длина выходного поля. Это поле имеет следующий фор-

       мат:

            !MDD

       В данном случае "M" - это десятичное  число,  задающее

  длину поля (внутри выходной строки),  в  которую  программа

  $FAO должна записать результат обработки  директивы.  Длина

  выражается как число символов;






                           - 696 -

                        00152-01 97 06


       3) оба поля вместе (счетчик повторений и длина  выход-

       ного поля). В  данном  случае  используется  следующий

       формат:

            !N(MDD)

       Счетчики повторений и длины выходных полей можно зада-

  вать как переменные, используя символ  номера  (#),  вместо

  того, чтобы задавать  абсолютное  числовое  значение.  Если

  символ номера (#) указан для счетчика повторений,  то  сле-

  дующий параметр, передаваемый программе FAO, должен  содер-

  жать счетчик. Если символ номера (#) указан  для  выходного

  поля, то следующий параметр должен содержать значение  дли-

  ны.

       Если символ номера (#) указан как для длины  выходного

  поля, так и для счетчика повторения,  то  требуется  только

  один параметр длины, каждая  выходная  строка  будет  иметь

  указанную длину.

       Если символ номера (#) указан для счетчика  повторений

  и/или для длины выходного поля, то параметр  (или  парамет-

  ры), задающие значение счетчика и/или длины,  должны  пред-

  шествовать другим параметрам, которые требует директива.


















                           - 697 -

                        00152-01 97 06


       Директивы программы $FAO.

       Директивы для подстановки в строку символов:

       !AC  - вводит строку со  счетчиком.  Данная  директива

            требует указания одного параметра - адреса  стро-

            ки, которую необходимо ввести. Первый байт строки

            должен содержать длину строки в символах;

       !AD  - вводит строку символов. Данная  директива  тре-

            бует указания двух параметров - длины строки и ее

            адреса.  Каждый  из  данных  параметров  является

            отдельным аргументом;

       !AF  - вводит строку в  и  заменяет  все  непечатаемые

            коды точками (.). Данная директива требует указа-

            ния двух параметров - длины строки и  ее  адреса.

            Каждый из данных  параметров  является  отдельным

            аргументом;

       !AS  - вводит строку. Данная директива требует  указа-

            ния одного параметра -  адреса  дескриптора  сим-

            вольной строки, указывающего на нужную строку.

  Директивы для преобразования чисел с заполнением нулями:

       !OB  - преобразовывает значение в байте  в  символьное

            представление восьмеричного  эквивалента  данного

            значения. Данная директива требует указания одно-

            го  параметра  -  значения,  которое   необходимо

            преобразовывать. Программа $FAO использует только

            младший байт длинного  слова,  содержащего  пара-

            метр;






                           - 698 -

                        00152-01 97 06


       !OW  - преобразовывает значение в слове  в  символьное

            представление восьмеричного  эквивалента  данного

            значения. Данная директива требует указания одно-

            го  параметра  -  значения,  которое   необходимо

            преобразовывать. Программа $FAO использует только

            младшее слово длинного слова, содержащего  данный

            параметр;

       !OL  - преобразовывает значение в длинном слове в сим-

            вольное представление  восьмеричного  эквивалента

            этого значения. Данная директива требует указания

            одного параметра - значения,  которое  необходимо

            преобразовывать;

       !XB  - преобразовывает значение в байте  в  символьное

            представление шестнадцатеричного эквивалента дан-

            ного значения. Данная директива требует  указания

            одного параметра - значения,  которое  необходимо

            преобразовывать. Программа $FAO использует только

            младший байт  длинного  слова,  содержащего  этот

            параметр.

       !XW  - преобразовывает значение в слове  в  символьное

            представление шестнадцатеричного эквивалента дан-

            ного значения. Данная директива требует  указания

            одного параметра - значения,  которое  необходимо

            преобразовать. Программа $FAO  использует  только

            младшее слово длинного слова, содержащего  данный

            параметр;






                           - 699 -

                        00152-01 97 06


       !XL  - преобразовывает значение в длинном слове в сим-

            вольное представление шестнадцатеричного  эквива-

            лента данного значения. Данная директива  требует

            одного параметра - значения,  которое  необходимо

            преобразовывать;

       !ZB  - преобразовывает значение в байте  без  знака  в

            символьное представление десятичного  эквивалента

            данного значения. Данная директива требует указа-

            ния одного параметра - значения, которое  необхо-

            димо преобразовывать. Программа  $FAO  использует

            только младший байт длинного  слова,  содержащего

            этот параметр;

       !ZW  - преобразовывает значение в слове  без  знака  в

            символьное представление десятичного  эквивалента

            данного значения. Данная директива требует одного

            параметра - значения, которое необходимо преобра-

            зовывать. Программа $FAO использует только  млад-

            шее  слово  длинного  слова,  содержащего  данный

            параметр;

       !ZL  - преобразовывает значение в  длинном  слове  без

            знака  в  символьное  представление   десятичного

            эквивалента данного  значения.  Данная  директива

            требует указания  одного  параметра  -  значения,

            которое необходимо преобразовывать.










                           - 700 -

                        00152-01 97 06


       Директивы для преобразования чисел с заполнением  про-

  белами:

       !UB  - преобразовывает значение в байте  без  знака  в

            символьное представление десятичного  эквивалента

            данного значения. Данная директива требует указа-

            ния одного параметра - значения, которое  необхо-

            димо преобразовывать. Программа  $FAO  использует

            только младший байт длинного  слова,  содержащего

            данный параметр;

       !UW  - преобразовывает значение в слове  без  знака  в

            символьное представление десятичного  эквивалента

            данного значения. Данная директива требует указа-

            ния одного параметра - значения, которое  необхо-

            димо преобразовывать. Программа  $FAO  использует

            только младшее слово длинного слова,  содержащего

            данный параметр;

       !UL  - преобразовывает значение в  длинном  слове  без

            знака  в  символьное  представление   десятичного

            эквивалента данного  значения.  Данная  директива

            требует указания  одного  параметра  -  значения,

            которое необходимо преобразовывать;

       !SB  - преобразовывает значение в байте  со  знаком  в

            символьное представление десятичного  эквивалента

            данного значения. Данная директива требует указа-

            ния одного параметра - значения, которое  необхо-

            димо преобразовывать. Программа  $FAO  использует

            только младший байт длинного  слова,  содержащего




                           - 701 -

                        00152-01 97 06


            данный параметр;

       !SW  - преобразовывает значение в слове  со  знаком  в

            символьное представление десятичного  эквивалента

            данного значения. Данная директива требует указа-

            ния одного параметра - значения, которое  необхо-

            димо преобразовывать. Программа  $FAO  использует

            младшее слово длинного слова, содержащего  данный

            параметр;

       !SL  - преобразовывает значение  в  длинном  слове  со

            знаком  в  символьное  представление  десятичного

            эквивалента данного  значения.  Данная  директива

            требует указания  одного  параметра  -  значения,

            которое необходимо преобразовывать.

       Директивы для форматирования выходной строки:

       !/   - вводит новую строку,  т.е.  возврат  каретки  и

            переход на новую строку. Данная директива не тре-

            бует параметров;

       !_   - вводит табуляцию. Данная директива  не  требует

            параметров;

       !^   - вводит подачу формы. Данная директива  не  тре-

            бует параметров;

       !!   - вводит восклицательный знак.  Данная  директива

            не требует параметров;

       !%S  - вводит букву "S", если последнее  преобразован-

            ное числовое значение не  равно  1.  Если  символ

            перед директивой !%S является  прописной  буквой,

            то вводится прописная буква "S". Если  же  данный




                           - 702 -

                        00152-01 97 06


            символ - строчная  буква,  то  вводится  строчная

            буква "S";

       !%T  - вводит системное время. Данная  директива  тре-

            бует указания одного параметра - адреса  квадрос-

            лова, содержащего значение времени, которое долж-

            но преобразовываться. Если указано 0, то вводится

            текущее системное время;

       !%U  - преобразовывает целое значение  UIC  в  длинном

            слове в стандартную спецификацию  UIC  в  формате

            [XXX,YYY] (XXX - номер группы; YYY -  номер  чле-

            на.) данная  директива  требует  указания  одного

            параметра - целое число в длинном слове. Директи-

            ва вводит охватывающие квадратные скобки  ([])  и

            запятую (,);

       %I   - преобразовывает длинное слово в соответствующий

            алфавитно-цифровой  идентификатор.  Если  длинное

            слово представляет идентификатор UIC, то в нужном

            месте вставляются квадратные скобки ([]) и  запя-

            тая (,). Если  не  существует  идентификатора,  а

            длинное слово представляет идентификатор UIC,  то

            длинное слово  форматируется  как  при  директиве

            !%U. В противном случае оно форматируется как при

            директиве !XL с  предшествующей  директивой  !%X,

            добавляемой  в   форматированную   результирующую

            строку;

       !%D  - вводит системную дату и время. Данная директива

            требует указания одного параметра - адреса  квад-




                           - 703 -

                        00152-01 97 06


            рослова, которое должно  преобразовываться.  Если

            указан 0, то вводится текущая  системная  дата  и

            время;

       !N<  - см. описание. директивы !>;

       !>   - данная и директива !N< используются вместе  для

            опеределения ширины выходного поля в  "N"  симво-

            лов, внутри которого все данные и директивы спра-

            ва от !N< и слева  от  >!  являются  выровненными

            влево и заполненными пробелами. Данная  директива

            не требует параметров;

       !N*C - повторяет символ "C" в выходной строке "N" раз.

       Директивы для интерпретации параметров:

       !- заставляет программу $FAO еще раз использовать пос-

          ледний использованный параметр  из  списка.  Данная

          директива не требует параметров;

       !+ - заставляет программу  $FAO  пропустить  следующий

          параметр в  списке.  Данная  директива  не  требует

          параметров.

       Возвращаемые значения кода состояния:

       SS$_NORMAL   - программа    системного    обслуживания

                    успешно завершилась;

       SS$_BUFFEROV - программа    системного    обслуживания

                    успешно   завершилась.    Форматированная

                    выходная  строка   переполнила   выходной

                    буфер и была усечена;

       SS$_ACCVIO   - вызывающий процесс не  может  прочитать

                    аргументы CTRSTR, P1, PN или PRMLST;  или




                           - 704 -

                        00152-01 97 06


                    не может  записать  аргумент  OUTLEN  (он

                    может задавать значение 0);

       SS$_BADPARAM - в управляющей строке FAO указана невер-

                    ная директива.



       13.50. $FILESCAN  -  просмотреть  спецификацию

              файла


       Программа системного обслуживания $FILESCAN  обрабаты-

  вает спецификацию файла и выделяет из нее  компоненты  этой

  спецификации.

       Формат:

       SYS$FILESCAN  SRCSTR, VALUELST, [FLDFLAGS]

       Аргументы:

       SRCSTR

       Использование в МОС ВП: CHAR_STRING

       Тип:                    текстовая строка

       Доступ:                 только чтение

       Механизм:               по дескриптору - дескриптор

                               строки фиксированной длины

       Строка, в которой осуществляется обработка  специфика-

  ции файла. Аргумент SRCSTS  является  адресом  дескриптора,

  указывающего на эту строку.

       VALUELST

       Использование в МОС ВП:  ITEM_LIST_2

       Тип:                     длинное слово (без знака)

       Доступ:                  модификация

       Механизм:                по ссылке



                           - 705 -

                        00152-01 97 06


       Список элементов, задающий, какие компоненты  специфи-

  кации файла должна возвращать программа  $FILESCAN.  Компо-

  нентами являются узел, устройство, каталог, имя файла,  тип

  файла и номер  версии.  Аргумент  ITMLST  является  адресом

  списка дескрипторов элементов, где каждый дескриптор специ-

  фицирует одну  компоненту.  Список  дескрипторов  элементов

  заканчивается длинным словом, содержащим значение 0.

       Рис. 59 описывает дескриптор элемента.


                     Дескриптор элемента

       31                      15                          0
       -----------------------------------------------------
       !    Код элемента        !     Длина компоненты     !
       -----------------------------------------------------
       !                   Адрес компоненты                !
       -----------------------------------------------------

                            Рис. 59

       Поля дескриптора элемента программы $FILESCAN:

  длина компоненты -

       Слово в которое программа  $FILESCAN  пишет  длину  (в

       Символах)   требуемой   компоненты.   Если   программа

       $FILESCAN не находит  компоненты,  то  она  возвращает

       Значение 0 в данном поле и в поле "адрес  компоненты",

       И возвращает значение кода состояния SS$NORMAL;

  код элемента -

       предоставляемый пользователем символический код длиной

       в слово, который  указывает  нужную  компоненту.  Коды

       элементов определяются макрокомандой $FSCNDEF;

  адрес компоненты -

       длинное слово, в  которое  программа  $FILESCAN  пишет




                           - 706 -

                        00152-01 97 06


       начальный адрес компоненты. Данный адрес указывает  на

       конкретное место в самой входной строке.

       Коды элементов программы $FILESCAN:

  FSCN$_FILESPEC -

       если  указан  данный  код   элемента,   то   программа

       $FILESCAN возвращает длину и  начальный  адрес  полной

       спецификации файла. Полная  спецификация  файла  может

       состоять из узла, устройства, каталога, имени, типа  и

       версии;

  FSCN$_NODE -

       если  указан  данный  код   элемента,   то   программа

       $FILESCAN возвращает длину  и  начальный  адрес  имени

       узла. Имя узла включает двойное двоеточие (::), а так-

       же управляющую строку доступа (если таковая имеется);

  FSCN$_DEVICE -

       если  указан  данный  код   элемента,   то   программа

       $FILESCAN возвращает длину  и  начальный  адрес  имени

       устройства. Имя устройства включает в себя одно  двое-

       точие (:);

  FSCN$_ROOT -

       если  указан  данный  код   элемента,   то   программа

       $FILESCAN возвращает длину и  начальный  адрес  строки

       имени корневого каталога. Строка имени корневого ката-

       лога включает в себя открывающую и  закрывающую  квад-

       ратные скобки ([]) или угловые скобки (<>);

  FSCN$_DIRECTORY -

       если  указан  данный  код   элемента,   то   программа




                           - 707 -

                        00152-01 97 06


       $FILESCAN возвращает длину  и  начальный  адрес  имени

       каталога. Имя каталога включает в себя  открывающую  и

       закрывающую квадратные скобки ([]) или угловые  скобки

       (<>);

  FSCN$_NAME -

       если  указан  данный  код   элемента,   то   программа

       $FILESCAN возвращает длину  и  начальный  адрес  имени

       файла. Имя файла не включает в себя никаких  синтакси-

       ческих  элементов.  Кроме  того,  программа  $FILESCAN

       возвращает длину и начальный адрес спецификации файла,

       взятой в кавычки, перед которой стоит имя узла (как  в

       спецификации NODE::"FILE-SPEC").  В  длину  включается

       открывающая и закрывающая кавычки;

  FSCN$_TYPE -

       если  указан  данный  код   элемента,   то   программа

       $FILESCAN возвращает длину и начальный адрес типа фай-

       ла. Тип файла включает  в  себя  предшествующую  точку

       (.);

  FSCN$_VERSION -

       если  указан  данный  код   элемента,   то   программа

       $FILESCAN возвращает длину и  начальный  адрес  номера

       версии файла. Номер версии файла включает в себя пред-

       шествующий разделитель: точку (.) или точку с  запятой

       (;).










                           - 708 -

                        00152-01 97 06


       FLDFLAGS

       Использование в МОС ВП:  MASK_LONGWORD

       Тип:                     длинное слово (без знака)

       Доступ:                  только запись

       Механизм:                по ссылке

       Длинное слово,  содержащее  маску  флагов,  в  которой

  программа $FILESCAN устанавливает бит для каждой компоненты

  спецификации файла, найденной во входной  строке.  Аргумент

  FLDFLAGS является адресом данного длинного слова  с  маской

  флагов.

       Символическое имя для  каждого  значащего  бита  флага

  определяется макрокомандой $FSCNDEF.

       В компоненты спецификации файла и соответствующие сим-

  волические имена всех битов флагов:

  FSCN$V_NODE -

       имя узла;

  FSCN$V_DEVICE -

       имя устройства;

  FSCN$V_ROOT -

       строка имени корневого каталога;

  FSCN$V_DIRECTORY -

       имя каталога;

  FSCN$V_NAME -

       имя файла;

  FSCN$V_TYPE -

       тип файла;






                           - 709 -

                        00152-01 97 06


  FSCN$V_VERSION -

       номер версии.

       Аргумент FLDFLAGS не обязателен. Данный аргумент  сле-

  дует указывать вместо  аргумента  VALUELST  если  требуется

  знать, какие компоненты присутствуют в строке  спецификации

  файла, и нет необходимости знать содержимое или длину  этих

  компонент.

       Описание.

       Если программа $FILESCAN находит частичную  специфика-

  цию файла (например, DISK:[FOO]), то она возвращает длину и

  начальный адрес этих компонент, обе из которых были  запро-

  шены в списке элементов и обе были найдены в  строке.  Если

  компонента была запрошена в списке элементов, но не найдена

  в строке, то  программа  $FILESCAN  возвращает  длину  0  и

  начальный адрес 0 в полях "длины компоненты" и "адрес  ком-

  поненты" дескриптора элемента для данной компоненты.

       Возвращенная информация обо всех  компонентах,  взятая

  вместе, составляет полную слитную строку спецификации  фай-

  ла. Например, чтобы выделить только имя и тип файла из пол-

  ной спецификации файла, можно сложить длины этих двух  ком-

  понент и использовать адрес первой компоненты (имя файла).

       Программа $FILESCAN не выполняет  содержательной  син-

  таксической проверки. В частности, она не  проверяет,  пра-

  вильную ли длину имеет компонента.










                           - 710 -

                        00152-01 97 06


       Однако, программа $FILESCAN выполняет  следующие  про-

  верки:

       1) компонента должна содержать требуемые  синтаксичес-

       кие элементы, например,  компонента  "каталог"  должна

       быть заключена в квадратные скобки, а за  именем  узла

       должно следовать двойное двоеточие (::);

       2) компонента не должна содержать недопустимых  симво-

       лов. Для каждой компоненты имеются  свои  недопустимые

       символы. Например,  запятая  (,)  является  допустимым

       символом в компоненте "каталог" и недопустимым  симво-

       лом в компоненте "тип файла";

       3)  пробелы,  символы  табуляции  и  возврата  каретки

       допустимы внутри  строки,  взятой  в  кавычки,  но  не

       допустимы в остальных местах.

       Недопустимые  символы  рассматриваются   как   символы

  завершения. Например, если  программа  $FILESCAN  встречает

  пробел внутри компоненты имени файла, то она  считает,  что

  данный пробел завершает строку полной спецификации файла.

       Программа системного обслуживания $FILESCAN распознает

  многонациональные алфавитные символы.

       Программа системного обслуживания $FILESCAN не  выпол-

  няет следующих действий:

       1) подстановку значений по умолчанию  для  неуказанных

  компонент спецификации файла;

       2) трансляцию логических имен для компонент;

       3) обработку символов обобщения;

       4) просмотр каталога.




                           - 711 -

                        00152-01 97 06


       Возвращаемые значения кода состояния:

       SS$_NORMAL    - успешное завершение;

       SS$_ACCVIO    - программа не может  прочитать  строку,

                     на которую указывает аргумент SRCSTR или

                     не может записать в дескриптор  элемента

                     в списке элементов, заданном  аргументом

                     VALUELST;

       SS$_BADPARAM  - список дескрипторов элементов содержит

                     неверный код элемента.



       13.51. $FIND_HELD  -   найти   идентификаторы,

              удерживаемые пользователем


       Программа системного обслуживания  $FIND_HELD  возвра-

  щает идентификатор (или идентификаторы), удерживаемый  ука-

  занным держателем.

       Формат:

       SYS$FIND_HELD     HOLDER,[ID],[ATTRIB],[CONTXT]

       Аргументы:

       HOLDER

       Использование в МОС ВП:  RIGHTS_HOLDER

       Тип:                     квадрослово (без знака)

       Доступ:                  только чтение

       Механизм:                по ссылке

       Держатель, чей идентификатор  (идентификаторы)  должны

  быть найдены  в  результате  работы  программы  $FIND_HELD.

  Аргумент HOLDER является адресом структуры данных, размером

  в квадрослово, содержащей идентификатор UIC  держателя,  за



                           - 712 -

                        00152-01 97 06


  которым следует длинное слово, содержащее значение нуль.

       ID

       Использование в МОС ВП:  RIGHTS_ID

       Тип:                     длинное слово (без знака)

       Доступ:                  только запись

       Механизм:                по ссылке

       Значение идентификатора, найденное в результате работы

  программы $FIND_HELD. Аргумент ID является адресом длинного

  слова, содержащего значение идентификатора, с которым  свя-

  зан держатель.

       ATTRIB

       Использование в МОС ВП:  MASK_LONGWORD

       Тип:                     длинное сово (без знака)

       Доступ:                  только запись

       Механизм:                по ссылке

       Атрибуты, связанные с идентификатором, который возвра-

  щается  в  аргументе  ID  в  результате  работы   программы

  $ADD_HOLDER. Аргумент ATTRIB является адресом длинного сло-

  ва, содержащего битовую маску, задающую атрибуты.

       Символическое значение, определяемое в системной  мак-

  робиблиотеке (макрокоманда $KGBDEF):

  KGB$V_RESOURCE -

       позволяет  держателю  затребовать  для  идентификатора

       ресурсы, подобные блокам на диске.

       Символические значения  являются  смещениями  в  битах

  внутри длинного слова. Данные значения можно также получить

  в виде  маски  с  установленными  соответствующими  битами,




                           - 713 -

                        00152-01 97 06


  используя вместо префикса KGB$V префикс KGB$M.

       CONTXT

       Использование в МОС ВП:  CONTEXT

       Тип:                     длинное слово (без знака)

       Доступ:                  модификация

       Механизм:                по ссылке

       Значение контекста, используемое при повторном  вызове

  программы  $FIND_HELD.  Аргумент  CONTXT  является  адресом

  длинного слова, которое используется при поиске всех  иден-

  тификаторов. Значение контекста  должно  инициализироваться

  нулем, а для  каждого  последовательного  вызова  программы

  $FIND_HELD должен быть представлен результирующий контекст.

  После  того,  как  аргумент   CONTEXT   передан   программе

  SYS$FIND_HELD, нельзя модифицировать его значение.

       Описание.

       Программа системного обслуживания  "найти  идентифика-

  тор, удерживаемый пользователем"  возвращает  идентификатор

  (или идентификаторы),  связанный  с  указанным  держателем.

  Чтобы определить все идентификаторы, удерживаемые указанным

  держателем,   необходимо   повторно   вызывать    программу

  SYS$FIND_HELD, пока  она  не  возвратит  код  SS$_NOSUCHID.

  Возврат данного кода означает, что  программа  вернула  все

  идентификаторы, очистила значение контекста и перераспреде-

  лила цепочку записей.

       Если вызовы программы  SYS$FIND_HELD  прекращаются  до

  того, как будет  возвращен  код  SS$_NOSUCHID,  то  следует

  использовать программу SYS$FINISH_RDB для очистки  значения




                           - 714 -

                        00152-01 97 06


  контекста и перераспределения цепочки записей.

       Если с данной программой используются символы  обобще-

  ния, то записи возвращаются в том порядке,  в  котором  они

  были первоначально записаны. Все искомые записи имеют  один

  и тот же идентификатор держателя, т.е. они имеют  дублирую-

  щие ключи, и извлекаются эти записи в том порядке, в  кото-

  ром они были записаны.

       Возвращаемые значения кода состояния:

       SS$_NORMAL   - успешное завершение;

       SS$_ACCVIO   - вызывающий процесс не  может  прочитать

                    аргумент ID или не может  записать  аргу-

                    менты HOLDER, ATTRIB или CONTXT;

       SS$_IVCHAN   - неверное содержимое длинного слова кон-

                    текста;

       SS$_INSFMEM  - для открытия базы данных прав нет  дос-

                    тупной динамической памяти процесса  дос-

                    таточного размера;

       SS$_IVIDENT  - указанный идентификатор держателя имеет

                    неверный формат;

       SS$_NOIOCHAN - нет больше доступных цепочек  контекста

                    базы данных прав;

       SS$_NOSUCHID - не существует указанного идентификатора

                    держателя; или у указанного держателя нет

                    больше удерживаемых им идентификаторов;

       RMS$_PRV     - пользователь не имеет доступа с чтением

                    в базу данных прав.

       Поскольку база данных прав является индексным  файлом,




                           - 715 -

                        00152-01 97 06


  доступ к которому осуществляется с помощью системы управле-

  ния данными МОС ВП, то данная программа системного обслужи-

  вания также может возвратить коды состояния системы СУД-32,

  связанные с операциями на  индексном  файле  (см.  документ

  [1]).



       13.52. $FIND_HOLDER    -    найти    дрежателя

              идентификатора


       Программа системного обслуживания $FIND_HOLDER возвра-

  щает держателя  указанного  идентификатора.  При  повторных

  вызовах с использованием длинного слова контекста она возв-

  ращает всех  держателей  указанного  идентификатора  в  том

  порядке, в котором они были добавлены.

       Формат:

       SYS$FIND_HOLDER     ID,[HOLDER],[ATTRIB],[CONTXT]

       Аргументы:

       ID

       Использование в МОС ВП: RIGHTS_ID

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Двоичное значение идентификатора, для  которого  прог-

  рамма $FIND_HOLDER находит держателя. Аргумент ID  является

  длинным словом, содержащим двоичное значение  идентификато-

  ра.







                           - 716 -

                        00152-01 97 06


       HOLDER

       Использование в МОС ВП: RIGHTS_HOLDER

       Тип:                    квадрослово (без знака)

       Доступ:                 только запись

       Механизм:               по значению

       Идентификатор  дрежателя,  возвращаемый  в  результате

  работы программы  $FIND_HOLDER.  Аргумент  HOLDER  является

  адресом квадрослова, содержащего  идентификатор  держателя.

  Первое длинное слово содержит идентификатор UIC  держателя,

  где старшее слово содержит номер группы, а младшее -  номер

  члена. Второе длинное слово содержит значение нуль.

       ATTRIB

       Использование в МОС ВП: MASK_LONGWORD

       Тип:                    длинное слово (без знака)

       Доступ:                 только запись

       Механизм:               по ссылке

       Маска атрибутов, связанных  с  записью  держателя,  на

  который указывает аргумент HOLDER. Аргумент ATTRIB является

  адресом длинного слова, содержащего маску атрибутов.

       Символическое значение, определяемое в системной  мак-

  робиблиотеке (макрокоманда $KGBDEF):

  KBG$V_RESOURCE -

       разрешает  держателю  затребовать  для  идентификатора

       ресурсы типа блоков на диске.

       Символические значения  являются  смещениями  в  битах

  внутри длинного слова. Данные значения можно получить также

  в виде масок, если вместо префикса KGB$V использовать  пре-




                           - 717 -

                        00152-01 97 06


  фикс KGB$М.

       CONTXT

       Использование в МОС ВП: CONTEXT

       Тип:                    длинное слово (без знака)

       Доступ:                 модификация

       Механизм:               по ссылке

       Значение контекста, которое  используется  при  поиске

  всех держателей указанного  идентификатора  при  выполнении

  программы $FIND_HOLDER. Аргумент  CONTXT  является  адресом

  длинного слова, содержащего значение контекста. Когда прог-

  рамма $FIND_HOLDER вызывается повторно,  то  значение  кон-

  текста должно иметь начальное значение нуль, а  при  каждом

  последовательном вызове программы $FIND_HOLDER представлять

  результирующий контекст. После того,  как  данный  агрумент

  передан программе, нельзя модифицировать его значение.

       Описание.

       Программа системного обслуживания $FIND_HOLDER возвра-

  щает держателя указаного идентификатора.  Чтобы  определить

  всех держателей идентификатора, необходимо  повторно  вызы-

  вать программу SYS$FIND_HOLDER до тех пор, пока она не вер-

  нет код SS$_NOSUCHID. Этот  код  указывает,  что  программа

  вернула все идентификаторы, очистила длинное слово контекс-

  та и перераспределила цепочку записей. В других случаях для

  очистки содержимого контекста и  перераспределения  цепочки

  записей следует использовать программу $FIND_RDB.

       Если запросы к  данной  программе  используют  символы

  обобщения, то записи возвращаются в том порядке, в  котором




                           - 718 -

                        00152-01 97 06


  они были первоначально записаны (запись находится по  иден-

  тификатору, а поскольку все требуемые записи имеют одинако-

  вый идентификатор, то они  извлекаются  в  том  порядке,  в

  котором были записаны).

       Возвращаемые значения кода состояния:

       SS$_NORMAL    - успешное завершение;

       SS$_ACCVIO    - вызывающий процесс не может  прочитать

                     аргумент ID, или не может записать аргу-

                     менты HOLDER, ATTRIB или CONTXT;

       SS$_IVCHAN    - неверное  содержание  длинного   слова

                     контекста;

       SS$_INSFMEM   - для открытия базы данных прав нет дос-

                     тупной динамической памяти процесса дос-

                     таточного размера;

       SS$_IVIDENT   - указанный идентификатор или  идентифи-

                     катор держателя имеют неверный формат;

       SS$_NOIOCHAN  - нет больше доступных цепочек контекста

                     базы данных прав;

       SS$_NOSUCHID  - в  базе  данных  прав  нет  указанного

                     идентификатора; или для указанного иден-

                     тификатора больше нет держателей;

       RMS$_PRV      - пользователь не имеет доступа  с  чте-

                     нием к базе данных прав.

       Поскольку база данных прав является индексным  файлом,

  доступ к которому осуществляется с помощью системы управле-

  ния данными СУД-32, то данная  программа  может  возвращать

  коды состояния системы, связанные с операциями с  индексным




                           - 719 -

                        00152-01 97 06


  файлом (см. документ [1]).



       13.53. $FINISH_RDB - завершить  контекст  базы

              данных прав


       Программа системного  обслуживания  $FINISH_RDB  пере-

  распределяет цепочку записей и очищает нулем значение  кон-

  текста, которое используется программами системного  обслу-

  живания $FIND_HELD, $FIND_HOLDER или $IDTOASC.

       Формат:

       SYS$FINISH_RDB   CONTXT



       Аргументы:

       CONTXT  (контекст)

       Использование в МОС ВП: CONTEXT

       Тип:                    длинное слово (без знака)

       Доступ:                 модификация

       Механизм:               по ссылке

       Значение контекста, которое должно очищаться в резуль-

  тате работы  данной  программы.  Аргумент  CONTXT  является

  длинным словом, содержащим адрес значения контекста.

       Описание.

       Программа системного обслуживания $FINISH_RDB  очищает

  нулями длинное слово, содержащее значение контекста и пере-

  распределяет цепочку записей, связанных с поисками  в  базе

  данных прав, которые выполняют программы системного  обслу-

  живания $IDTOASC, $FIND_HOLDER и $FIND_HELD.





                           - 720 -

                        00152-01 97 06


       Если повторные вызовы данных программ системного  обс-

  луживания выполняются до тех пор, пока не  будет  возвращен

  код возврата SS$_NOSUCHID, то  нет  необходимости  вызывать

  программу $FINISH_RDB, поскольку цепочка записей уже  пере-

  распределена, а длинное слово, содержащее значение контекс-

  та, уже очищено нулями.

       Возвращемые значения кода состояния:

       SS_NORMAL   - программа системного  обслуживания  нор-

                   мально завершилась;

       SS$_ACCVIO  - вызывающий  процесс  не  может  записать

                   аргумент CONTXT;

       SS$_IVCHAN  - неверно  значение  содержимого   длиного

                   слова контекста.



       13.54. $FORCEX - принудительный выход


       Программа системного обслуживания $FORCEX  запрашивает

  вызов программы системного обслуживания "выход" ($EXIT) для

  заданного процесса.

       Формат:

       SYS$FORCEX     [PIDADR],[PRCNAM],[CODE]

       Аргументы:

       PIDADR

       Использование в МОС ВП: PROCESS_ID

       Тип:                    длинное слово (без знака)

       Доступ:                 модификация

       Механизм:               по ссылке





                           - 721 -

                        00152-01 97 06


       Идентификатор процесса (PID), для которого  необходимо

  организовать принудительный выход. Аргумент  PIDADR  -  это

  адрес длинного слова, содержащего PID.

       Аргумент  PIDADR  необязательный,  но  его  необходимо

  задавать в том случае, если процесс, для которого необходи-

  мо осуществить принудительный выход, не принадлежит  к  той

  же группе UIC, что и вызывающий процесс.

       Если  не  указаны  ни  аргумент  PIDADR,  ни  аргумент

  PRCNAM, то осуществляется принудительный  выход  вызывающей

  программы и управление не возвращается.

       PRCNAM

       Использование в МОС ВП: PROCESS_NAME

       Тип:                    строка текста

       Доступ:                 только чтение

       Механизм:               по дескриптору - дескриптор

                               строки с фиксированной длиной

       Имя процесса, для которого требуется осуществить  при-

  нудительный выход. Аргумент PRCNAM - это адрес дескриптора,

  указывающего на строку имени процесса длиной  от  1  до  15

  символов.

       Аргумент PRCNAM можно использовать только для  процес-

  сов, принадлежащих к той же группе UIC,  что  и  вызывающий

  процесс. Чтобы организовать принудительный выход  для  про-

  цессов в других группах, необходимо  использовать  аргумент

  PIDADR. Это ограничение является результатом того, что опе-

  рационная система МОС ВП интерпретирует  номер  группы  UIC

  вызывающего процесса как часть указанного  имени  процесса;




                           - 722 -

                        00152-01 97 06


  то есть, имена процессов уникальны для группы UIC.

       Если  не  указаны  ни  аргумент  PIDADR,  ни  аргумент

  PRCNAM, то осуществляется принудительный  выход  вызывающей

  программы и управление не возвращается.

       CODE

       Использование в МОС ВП: COND_VALUE

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Значение кода завершения, которое должно использовать-

  ся как параметр выхода. Аргумент CODE - это длинное  слово,

  содержащее данное значение. Если аргумент CODE  не  указан,

  то передается значение 0.

       Описание.

       В зависимости  от  конкретной  операции  использование

  может потребовать наличия у вызывающего процесса  некоторых

  привилегий:

       1) привилегия GROUP требуется для того, чтобы осущест-

  вить принудительный выход процесса, принадлежащего к той же

  группе, что и вызывающий процесс, но имеющий другой UIC;

       2) привилегия WORLD требуется  для  того,  чтобы  осу-

  ществлять принудительный выход любого процесса в системе.

       Программа  системного   обслуживания   "принудительный

  выход" требует системную динамическую память.

       Образ, работающий в указанном процессе, последователь-

  но выполняет обычные программы выхода. Например, если  были

  заданы какие-либо обработки выхода, то они получат управле-




                           - 723 -

                        00152-01 97 06


  ние прежде, чем произойдет фактический выход. Если нормаль-

  ный выход нежелателен, то необходимо использовать программу

  системного обслуживания "удалить процесс" (DELPRC).

       Когда для какого-то  процесса  запрашивается  принуди-

  тельный выход, AST пользовательского режима ставится в оче-

  редь к данному процессу. Программа обработки AST приводит к

  тому, что указанный процесс  осуществляет  вызов  программы

  системного осблуживания $EXIT. Поскольку используется меха-

  низм AST, необходимо, чтобы  для  заданного  процесса  были

  разрешены AST пользовательского режима, либо выход не  осу-

  ществляется, пока AST не будут снова разрешены. Таким обра-

  зом, например, приостановленный процесс  нельзя  остановить

  при помощи $FORCEX. Процесс, который вызывает  $FORCEX,  не

  получает извещения о том, что выход не был выполнен.

       Программа  системного  обслуживания  $FORCEX   успешно

  завершается, если запрос на принудительный выход уже  пере-

  дан указанному процессу, хотя выход не завершен.

       Возвращаемые значения кода состояния:

       SS$_NORMAL    - успешное завершение;

       SS$_ACCVIO    - вызывающя программа не может прочитать

                     строку  имени  процесса  или  дескриптор

                     строки, или не может записать  индикатор

                     процесса;

       SS$_IVLOGNAM  - строка имени  процесса  имеет  нулевую

                     длину или длину больше 15;

       SS$_NONEXPR   - предупреждение.  Заданный  процесс  не

                     существует, либо указан неверный иденти-




                           - 724 -

                        00152-01 97 06


                     фикатор процесса;

       SS$_NOPRIV    - процесс не имеет привилегии, необходи-

                     мой для принудительного выхода заданного

                     процесса;

       SS$_INSFMEM   - недостаточно  системной   динамической

                     памяти для данной операции.



       13.55. $FORMAT_ACL  -  форматировать   элемент

              списка управления доступом


       Программа системного обслуживания $FORMAT_ACL формати-

  рует указанный элемент (ACE) списка ACL в текстовую строку.

       Формат:

       SYS$FORMAT_ACL     ACLENT,[ACLLEN],ACLSTR,[WIDTH],

                          [TRMDSC],[IDENT],[ACCNAM]

       Аргументы:

       ACLENT

       Использование в МОС ВП: CHAR_STRING

       Тип:                    текстовая строка

       Доступ:                 только чтение

       Механизм:               по дескриптору - дескриптор

                               строки фиксированной длины

       Описание отформатированного элемента ACE, который дол-

  жен быть получен  в  результате  работы  данной  программы.

  Аргумент ACLENT является адресом дескриптора,  указывающего

  на буфер, который содержит описание входного элемента  ACE.

  Первый байт этого буфера содержит длину элемента ACE.  Вто-

  рой байт этого буфера содержит значение, которое  идентифи-



                           - 725 -

                        00152-01 97 06


  цирует тип элемента ACE, который в свою очередь  определяет

  формат ACE.

       ACLLEN

       Использование в МОС ВП: WORD_UNSIGNED

       Тип:                    слово (без знака)

       Доступ:                 только запись

       Механизм:               по ссылке

       Длина выходной строки, которая формируется в результа-

  те работы данной программы. Аргумент ACLLEN является  адре-

  сом слова, содержащего число символов, записанных  в  аргу-

  мент ACLSTR.

       ACLSTR

       Использование в МОС ВП: CHAR_STRING

       Тип:                    текстовая строка

       Доступ:                 только запись

       Механизм:               по дескриптору - дескриптор

                               строки фиксированной длины

       Форматированный элемент ACE, полученный  в  результате

  работы  программы  $FORMAT_ACL.  Аргумент  ACLSTR  является

  адресом дескриптора строки, указывающего на буфер, содержа-

  щий выходную строку.

       WIDTH

       Использование в МОС ВП: WORD_UNSIGNED

       Тип:                    слово (без знака)

       Доступ:                 только чтение

       Механизм:               по ссылке

       Максимальная величина форматированного  элемента  ACE,




                           - 726 -

                        00152-01 97 06


  который   получается   в   результате   работы    программы

  $FORMAT_ACL. Аргумент WIDTH являтеся адресом слова,  содер-

  жащего максимальную величину форматированного элемента ACE.

  Если данный аргумент опущен или содержит нулевое  значение,

  то предполагается неограниченная  длина  выводимой  строки.

  Если заданная величина превышена,  то  вставляется  символ,

  указанный аргументом TRMDSC.

       TRMDSC

       Использование в МОС ВП: CHAR_STRING

       Тип:                    текстовая строка

       Доступ:                 только чтение

       Механизм:               по дескриптору - дескриптор

                               строки фиксированной длины

       Символ (или символы) окончания строки, которые исполь-

  зуются в  форматированном  элементе  ACE.  Аргумент  TRMDSC

  является адресом дескриптора, указывающего на строку симво-

  лов, содержащую символ (символы) окончания для каждого фор-

  матированного элемента ACE. Данные символы вставляются  при

  превышении заданной величины.

       IDENT

       Использование в МОС ВП: WORD_UNSIGNED

       Тип:                    слово (без знака)

       Доступ:                 только чтение

       Механизм:               по ссылке

       Число пробелов, начинающих каждую строку форматирован-

  ного элемента ACE. Аргумент IDENT является  адресом  слова,

  содержащего число пробелов,  которые  необходимо  ввести  в




                           - 727 -

                        00152-01 97 06


  начало каждого форматированного элемента ACE.

       ACCNAM

       Использование в МОС ВП: ACCESS_BIT_NAMES

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по ссылке

       Имена битов в маске доступа при  выполнении  программы

  $FORMAT_ACL. Аргумент ACCNAM является адресом массива из 32

  дескрипторов размером в квадрослово каждый, которые опреде-

  ляют имена битов в маске доступа. Каждый элемент  указывает

  на имя бита. Первый элемент указывает на имя бита 0, второй

  - на имя бита 1 и т.д.

       Если аргумент ACCNAM опущен, то используются следующие

  имена:

       Бит 0 - READ

       Бит 1 - WRITE

       Бит 2 - EXECUTE

       Бит 3 - DELETE

       Бит 4 - CONTROL

       Бит 5 - BIT_5

       Бит 6 - BIT_6

            . . .

       Бит 31 - BIT_31












                           - 728 -

                        00152-01 97 06


  описание

       Программа системного обслуживания $FORMAT_ALL формати-

  рует указанный элемент (ACE) списка ACL в  представление  в

  виде текстовой строки. Смещения в байтах и  значения  типов

  определены  в   системной   макробиблиотеке   (макрокоманда

  $ACEDEF).

       Сигнальный элемент  ACE  устанавливает  сигнал  защиты

  доступа. Он имеет следующий формат, изображенный на рис.60.


                 Сигнальный элемент ACE

       ------------------------------------------------------
       !       Флаги            !     Тип     !   Длина     !
       ------------------------------------------------------
       !                  Доступ                            !
       ------------------------------------------------------
       !               Имя сигнала                          !
       ------------------------------------------------------

                              Рис. 60


       В табл. 56 описаны поля сигнального элемента.


                                                   Таблица 56

  -----------------------------------------------------------

  Поле  !Символическое имя!      Описание

  -----------------------------------------------------------

  Длина ! ACE$B_SIZE      !Байт, содержащий длину в байтах

        !                 !буфера элемента ACE

  Тип   ! ACE$B_TYPE      !Байт, содержащий значение типа

        !                 !ACE$C_ALARM

  Флаги ! ACE$W_FLAGS     !Слово, содержащее информацию о

        !                 !сигнальном элементе ACE и информа-




                           - 729 -

                        00152-01 97 06


                                         Продолжение табл. 56

  -----------------------------------------------------------

  Поле  !Символическое имя!      Описание

  -----------------------------------------------------------

        !                 !цию, не зависящую от типа элемента

        !                 !ACE

  Доступ! ACE$L_ACCESS    !Длинное слово, содержащее маску,

        !                 !указывающую, для каких режимов

        !                 !доступа установлен сигнал

  Имя   ! ACE$T_AUDITNAME !Строка символов рассчитанной дли-

  сигна-!                 !ны, содержащая имя сигнала

  ла    !                 !


       Поле "флаги" содержит информацию, специфичную для эле-

  ментов ACE, и информацию, относящуюся ко всем типам ACE.

       Следующие символические имена являются битовыми смеще-

  ниями для информации сигнального элемента ACE:

  ACE$V_SUCCESS - указывает,  что сигнал  выдается при успеш-

       ном доступе;

  ACE$V_FAILURE - указывает, что сигнал выдается при  неудач-

       ном доступе.

       Следующие символические имена явлются битовыми  смеще-

  ниями для информации об ACE, не зависящей от типа ACE:

  ACE$V_DEFAULT - данный элемент ACE добавлен  к  списку  ACL

       любого файла, созданного в каталоге,  чей  список  ACL

       содержит этот ACE. Эта возможность относится только  к

       элементам из списка ACL файла каталога;





                           - 730 -

                        00152-01 97 06


  ACE$V_HIDDEN - данный элемент ACE  зависит  от  приложения.

       для изменения установки данного бита нельзя  использо-

       вать ни команду ACL языка DCL, ни редактор ACL. Коман-

       да DIRECTORY/ACL  языка  DCL  не  выводит  на  дисплей

       содержимое этого ACE;

  ACE$V_NOPROPAGATE - данный элемент не  распространяется  на

       версии того же самого файла;

  ACE$V_PROTECTED - данный элемент  ACE  не  удаляется,  если

       удаляется весь список ACL. Данный ACE необходимо  уда-

       лять явно.

       Следующие  символические  значения  являются  битовыми

  смещениями в маске доступа. Эти символические значения мож-

  но также получить в виде маски с  установленным  соответст-

  вующим  битом,  используя  вместо  префикса  ACE$V  префикс

  ACE$M.

  ACE$V_READ - контролируется доступ с чтением;

  ACE$V_WRITE - контролируется доступ с записью;

  ACE$V_EXECUTE - контролируется доступ с выполнением;

  ACE$V_DELETE - контролируется доступ с удалением;

  ACE$V_CONTROL - контролируется модификация поля, к которому

       Осуществляется доступ.

       Элемент ACE приложения содержит информацию,  зависящую

  от приложения. Он имеет формат, изображенный на рис.61.












                           - 731 -

                        00152-01 97 06


                    Элемент ACE приложения

       ------------------------------------------------------
       !         Флаги         !    Тип      !    Длина     !
       ------------------------------------------------------
       !               Маска приложения                     !
       ------------------------------------------------------
       !                   .                                !
       !                   .                                !
       !             Прикладная информация                  !
       !                   .                                !
       !                   .                                !
       ------------------------------------------------------

                         Рис. 61


       В табл.57 описаны поля элемента ACE приложения.


                                                   Таблица 57

  -----------------------------------------------------------

   Поле !Символическое имя !     Описание

  -----------------------------------------------------------

  Длина !ACE$B_SIZE        !Байт, содержащий  длину в байтах

        !                  !буфера элемента ACE

  Тип   !ACE$B_TYPE        !Байт, содержащий значение типа

        !                  !ACE$C_INFO

  Флаги !ACE$W_FLAGS       !Слово, содержащее информацию об

        !                  !элементе ACE приложения и инфор-

        !                  !мацию, не зависящую от типа эле-

        !                  !мента ACE

  Маска !ACE$L_INFO_FLAGS  !Длинное слово, содержащее маску,

  прило-!                  !которая  определяется и  исполь-

  жения !                  !зуется приложением

  Инфор-!ACE$T_INFO_START  !Структура данных переменной дли-

  мация !                  !ны, которая определяется и ис-




                           - 732 -

                        00152-01 97 06


                                         Продолжение табл. 57

  -----------------------------------------------------------

   Поле !Символическое имя !     Описание

  -----------------------------------------------------------

  прило-!                  !пользуется приложением. Длина

  жения !                  !этих данных задается полем длины


       Поле "флаги" содержит информацию, специфичную для эле-

  ментов ACE приложения, и информацию,  относящуюся  ко  всем

  типам элементов ACE.

       Следующее символическое

  ACE$V_INFO_TYPE - четырехбитовое поле, содержащее значение,

       которое индицирует, является ли данное приложение при-

       ложением CSS (ACE$C_CSS) или приложением  пользователя

       (ACE$C_CUST).

       Следующие символические имена являются битовыми смеще-

  ниями для не зависящей от

  ACE$V_DEFAULT - данный элемент ACE добавлен  к  списку  ACL

       любого файла, созданного в каталоге,  чей  список  ACL

       содержит  данный  ACE.  Данная  возможность  относится

       только к элементу ACE из списка ACL файла каталога;

  ACE$V_HIDDEN - данный элемент  ACE  зависит  от  приложения

       для изменения установки этого бита нельзя использовать

       ни команду ACL языка DCL,  ни  редактор  ACL.  Команда

       DIRECTORY/ACL языка DCL не выводит на дисплей содержи-

       мое данного ACE;

  ACE$V_NOPROPAGATE - данный элемент ACE не  распространяется





                           - 733 -

                        00152-01 97 06


       на версии того же самого файла;

  ACE$V_PROTECTED - данный элемент ACE не удаляется, даже ес-

       ли удаляется весь список ACL.  Данный  ACE  необходимо

       удалять явно.

       Элемент ACE защиты по умолчанию для каталога задает на

  основе идентификатора UIC защиту всех файлов,  созданных  в

  каталоге. Данный тип ACE можно использовать только в  спис-

  ках ACL файлов каталога. Он имеет формат,  изображенный  на

  рис.62.



               Элемент ACE защиты по умолчанию

       ------------------------------------------------------
       !         Флаги          !    Тип       !    Длина   !
       ------------------------------------------------------
       !                   Резерв                           !
       ------------------------------------------------------
       !                   Система                          !
       ------------------------------------------------------
       !                  Владелец                          !
       ------------------------------------------------------
       !                   Группа                           !
       ------------------------------------------------------
       !                    Все                             !
       ------------------------------------------------------

                        Рис. 62


       В табл. 58 описаны поля элемента ACE защиты по умолча-

  нию.















                           - 734 -

                        00152-01 97 06


                                                   Таблица 58

  -----------------------------------------------------------

    Поле ! Символическое!     Описание

         ! имя          !

  -----------------------------------------------------------

  Длина  !ACE$B_SIZE    !Байт, содержащий длину в байтах бу-

         !              !фера ACE

  Тип    !ACE$B_TYPE    !Байт, содержащий значение типа

         !              !ACE$C_DIRDEF

  Флаги  !ACE$W_FLAGS   !Слово, содержащее информацию, не

         !              !зависящую от типа ACE

  Резерв !ACE$L_SPARE1  !Длинное слово, не используется.

         !              !должно содержать нуль

  Систе- !ACE$L_SYS_PROT!Длинное слово, содержащее маску,

  ма     !              !которая задает метод доступа, пре-

         !              !доставленный системным пользовате-

         !              !лям. Каждый бит представляет один

         !              !тип доступа

  Владе- !ACE$L_OWN_PROT!Длинное слово, содержащее маску,

  лец    !              !которая задает режим доступа, пре-

         !              !доставленный владельцу. Каждый бит

         !              !предоставляет один тип доступа

  Группа !ACE$L_GRP_PROT!Длинное слово, содержащее маску,

         !              !которая задает режим доступа, пре-

         !              !доставленный групповым пользовате-

         !              !лям. Каждый бит предоставляет один

         !              !тип доступа




                           - 735 -

                        00152-01 97 06


                                         Продолжение табл. 58

  -----------------------------------------------------------

    Поле ! Символическое!     Описание

         ! имя          !

  -----------------------------------------------------------

  Все    !ACE$L_WOR_PROT!Длинное слово, содержащее маску,

         !              !которая задает режим доступа, пре-

         !              !доставленный всем пользователям.

         !              !Каждый бит представляет один тип

         !              !доступа

       Поле флагов содержит информацию, относящуюся  ко  всем

  типам элементов ACE. Следующие символические имена являются

  битовыми смещениями для не зависящей от типа  ACE  информа-

  ции:

  ACE$V_DEFAULT - данный элемент ACE добавлен  к  списку  ACL

       любого файла, созданного в каталоге,  чей  список  ACL

       содержит этот ACE. Данная возможность относится только

       к элементу ACE из списка ACL файла каталога;

  ACE$V_HIDDEN - данный элемент ACE  зависит  от  приложения.

       Для изменения установки этого бита нельзя использовать

       ни команду ACL языка DCL,  ни  редактор  ACL.  Команда

       DIRECTORY/ACL языка DCL не выводит на дисплей содержи-

       мого данного ACЕ;

  ACE$V_NOPROPAGATE - данный элемент ACE не  распространяется

       на версии того же самого файла;

  ACE$V_PROTECTED - данный элемент ACE не удаляется, даже ес-

       ли удаляется весь список ACL. Данный элемент ACE необ-




                           - 736 -

                        00152-01 97 06


       ходимо удалять явно.

       Следующие символические имена являются битовыми смеще-

  ниями в маске, указывающей метод доступа, заданный в  полях

  "система", "владелец", "группа" и "все"

  ACE$V_READ - предоставлен доступ с чтением;

  ACE$V_WRITE - предоставлен доступ с записью;

  ACE$V_EXECUTE - предоставлен доступ с выполнением;

  ACE$V_DELETE - предоставлен доступ с удалением.

       Эти символические имена можно получить в  виде  масок,

  если вместо префикса ACE$V использовать префикс ACE$M.

       Элемент ACE идентификатора управляет доступом к об'ек-

  ту на основе идентификаторов. Он имеет формат, изображенный

  на рис.63.


                 Элемент ACE идентификатора

       ------------------------------------------------------
       !         Флаги          !   Тип       !   Длина     !
       ------------------------------------------------------
       !                Доступ                              !
       ------------------------------------------------------
       !                Резерв                              !
       ------------------------------------------------------
       !                Резерв                              !
       ------------------------------------------------------
       !                  .                                 !
       !                  .                                 !
       !                  .                                 !
       ------------------------------------------------------
       !              Идентификатор                         !
       ------------------------------------------------------
       !              Идентификатор                         !
       ------------------------------------------------------
       !                   .                                !
       !                   .                                !
       !                   .                                !
       ------------------------------------------------------

                          Рис. 63





                           - 737 -

                        00152-01 97 06


       В табл. 59 описаны поля элемента ACE идентификатора.


                                                   Таблица 59

  -----------------------------------------------------------

    Поле ! Символическое!    Описание

         ! имя          !

  -----------------------------------------------------------

  Длина  !ACE$B_SIZE    !Байт, содержащий длину в байтах бу-

         !              !фера элемента ACE

  Тип    !ACE$B_TYPE    !Байт, содержащий значение типа

         !              !ACE$C_KEYID

  Флаги  !ACE$W_FLAGS   !Слово, содержащее информацию об эле-

         !              !менте ACE идентификатора и информа-

         !              !цию, не зависящую от типа элемента

         !              !ACE

  Доступ !ACE$L_ACCESS  !Длинное слово, содержащее маску,

         !              !которая задает вид доступа, предос-

         !              !тавленный указанным идентификаторам

  Резерв !ACE$V_RESERVED!Длинное слово, содержащее информа-

         !              !цию, специфичную для данного прило-

         !              !жения.

         !              !Число зарезервированных длинных слов

         !              !задается в поле "флаги"

  Иденти-!ACE$L_KEY     !Длинное слово, содержащее идентифи-

  фикатор!              !каторы. Число длинных слов задается

         !              !полем ACE$B_LENGTH. Если пользова-

         !              !тель, пытающийся получить доступ,




                           - 738 -

                        00152-01 97 06


                                         Продолжение табл. 59

  -----------------------------------------------------------

    Поле ! Символическое!    Описание

         ! имя          !

  -----------------------------------------------------------

         !              !является держателем, всех перечис-

         !              !ленных идентификаторов, то ACE со-

         !              !ответствует этому пользователю, и

         !              !ему предоставляется доступ, указан-

         !              !ный полем ACE$L_ACCESS


       Поле "флаги" содержит как информацию, специфичную  для

  элемента ACE идентификатора, так и информацию,  относящуюся

  ко всем типам элементов ACE.

       Следующее символическое имя является битовым смещением

  для элемента ACE идентификатора:

  ACE$V_RESERVED - четырехбитовое поле, содержащее число дли-

       нных слов, которые резервируются для данных, зависящих

       от приложения. Данное число должно быть между 0 и  15.

       Зарезервированные слова, если они есть, непосредствен-

       но предшествуют идентификаторам.

       Следующие символические имена являются битовыми смеще-

  ниями для не зависящей от типа ACE информации:

  ACE$V_DEFAULT - данный элемент ACE добавлен  к  списку  ACL

       любого файла, созданного в каталоге,  чей  список  ACL

       содержит  данный  ACE.  Данная  возможность  относится

       только к элементу ACE из списка ACL файла каталога;





                           - 739 -

                        00152-01 97 06


  ACE$V_HIDDEN - данный элемент ACE  зависит  от  приложения.

       Для изменения установки данного бита нельзя  использо-

       вать ни команду ACL языка DCL, ни редактор ACL. Коман-

       да DIRECTORY/ACL  языка  DCL  не  выводит  на  дисплей

       содержимое данного ACE;

  ACE$V_NOPROPAGATE - данный элемент ACE не  распространяется

       на версии того же самого файла;

  ACE$V_PROTECTED - данный элемент ACE не удаляется, даже ес-

       ли удаляется весь список ACL. Данный элемент ACE необ-

       ходимо удалить явно.

       Следующие  символические  значения  являются  битовыми

  смещениями в маске, указывающей  вид  доступа,  заданный  в

  полях "система", "группа", "владелец" и "все":

  ACE$V_READ - предоставлен доступ с чтением;

  ACE$V_WRITE - предоставлен доступ с записью;

  ACE$V_EXECUTE - предоставлен доступ с выполнением;

  ACE$V_DELETE - предоставлен доступ с удалением;

  ACE$V_соNTROL - предоставлен доступ к полю с его модифика-

       Цией.

       Эти символические значения можно также получить в виде

  масок, если  вместо  префикса  ACE$V  использовать  префикс

  ACE$M.

       Возвращаемые значения кода состояния:

       SS$_NORMAL -   программа    системного    обслуживания

                      успешно завершилась;

       SS$_ACCVIO -   вызывающий процесс не  может  прочитать

                      элемент списка ACL, или его дескриптор,




                           - 740 -

                        00152-01 97 06


                      или дескриптор строки.  Или  вызывающий

                      процесс не может записать  слово  длины

                      или буфер строки;

       SS$_BUFFEROVF  программа    системного    обслуживания

                      успешно  завершилась.  Выходная  строка

                      переполнила буфер и была усечена.



       13.56. $GETDVI  -   получить   информацию   об

              устройстве/томе


       Программа системного обслуживания  $GETDVI  возвращает

  информацию об устройстве ввода-вывода. Эта информация  сос-

  тоит из первичных и вторичных характеристик устройства.

       Программа системного обслуживания $GETDVI  завершается

  асинхронно, то есть она возвращает управление вызвавшему ее

  процессу, поставив в очередь запрос на информацию и не ожи-

  дая, пока будет возвращена запрошенная информация.

       Для синхронного завершения следует использовать  прог-

  рамму  системного  обслуживания  "получить  информацию   об

  устройстве/томе и ждать" ($GETDVIW). Данная программа  сис-

  темного обслуживания полностью идентична программе  $GETDVI

  за исключением того, что программа $GETDVIW возвращает выз-

  вавшему ее процессу управление вместе с запрошенной  инфор-

  мацией (см подраздел 2.5).











                           - 741 -

                        00152-01 97 06


       Формат:

       SYS$GETDVI     [EFN],[CHAN],[DEVNAM],ITMLST,

                      [IOSB],[ASTADR],[ASTPRM],[NULLARG]

       Аргументы:

       EFN

       Использование в МОС ВП: EF_NUMBER

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Номер флага события,  который  должен  устанавливаться

  после того, как программа $GETDVI вернет запрошенную инфор-

  мацию. Аргумент EFN  является  длинным  словом,  содержащим

  данный номер.

       При инициировании запроса программа $GETDVI сбрасывает

  указанный флаг события (или флаг события 0, если  не  задан

  аргумент EFN). Затем, когда  программа  $GETDVI  возвращает

  запрошенную информацию, она  устанавливает  указанный  флаг

  события (или флаг события 0).

       CHAN

       Использование в МОС ВП: CHANNEL

       Тип:                    слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Номер канала ввода-вывода, назначенный  устройству,  о

  котором запрашивается информация.  Аргумент  CHAN  является

  словом, содержащим данный номер.

       Чтобы  идентифицировать   устройство   для   программы




                           - 742 -

                        00152-01 97 06


  $GETDVI, можно указать либо аргумент  CHAN,  либо  аргумент

  DEVNAM, но нельзя  указывать  оба  данные  аргумента.  Если

  заданы оба аргумента, то используется аргумент CHAN.

       Если не указан ни один из этих аргументов, то програм-

  ма $GETDVI использует для аргумента CHAN значение 0, приня-

  тое по умолчанию.

       DEVNAM

       Использование в МОС ВП: DEVICE_NAME

       Тип:                    текстовая строка

       Доступ:                 только чтение

       Механизм:               по дескриптору - дескриптор

                               строки фиксированной длины

       Имя устройства, о  котором  программа  $GETDVI  должна

  вернуть информацию. Аргумент DEVNAM является адресом  деск-

  риптора строки символов, указывающего на эту строку имени.

       Строка имени устройства может быть либо  именем  физи-

  ческого устройства, либо  логическим  именем.  Если  первым

  символом в строке является  знак  подчеркирования  (_),  то

  строка рассматривается как имя  физического  устройства,  в

  противном случае строка рассматривается как логическое  имя

  и выполняется трансляция логического имени. Данная трансля-

  ция выполняется до тех пор, пока либо не будет получено имя

  физического устройства, либо число трансляций  не  превысит

  предельного числа, установленного при генерации системы.

       Если строка имени устройства  содержит  двоеточие,  то

  данное двоеточие и все следующие за ним символы игнорируют-

  ся.




                           - 743 -

                        00152-01 97 06


       Чтобы  идентифицировать   устройство   для   программы

  $GETDVI можно указать либо  аргумент  CHAN,  либо  аргумент

  DEVNAM, но нельзя указывать оба данных аргумента. Если ука-

  заны оба аргумента, то используется аргумент CHAN.

       Если не указан ни один из этих аргументов, то програм-

  ма $GETDVI использует для аргумента CHAN значение 0, приня-

  тое по умолчанию.

       ITMLST

       Использование в МОС ВП: ITEM_LIST_3

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по ссылке

       Список элементов, задающий, какую информацию  об  уст-

  ройстве должна вернуть программа $GETDVI.  Аргумент  ITMLST

  является адресом списка дескрипторов элементов,  каждый  из

  которых описывает элемент информации.  Список  дескрипторов

  элементов заканчивается длинным словом, содержащим значение

  0. Рис.64 описывает формат дескриптора элемента.


                     Дескриптор элемента

       31                         15                        0
       ------------------------------------------------------
       !       Код элемента       !     Длина буфера        !
       ------------------------------------------------------
       !                 Адрес буфера                       !
       ------------------------------------------------------
       !             Адрес возвращаемой длины               !
       ------------------------------------------------------

                           Рис. 64








                           - 744 -

                        00152-01 97 06


       Поля дескриптора элемента программы $GETDVI:

  длина буфера - слово, содержащее целое число, предоставляе-

       мое пользователем. Указывает длину (в байтах)  буфера,

       в который программа $GETVDVI должна записывать  инфор-

       мацию. Необходимая длина буфера зависит  от  элемента,

       заданного в поле "код элемента" дескриптора  элемента.

       Если величина в поле "длина буфера" слишком  мала,  то

       программа $GETDVI усекает данные;

  код элемента - слово, содержащее предоставляемый  пользова-

       телем символический код, который указывает, какой эле-

       мент информации должна вернуть программа $GETDVI.  Эти

       данные определяются с помощью макрокоманды $DVIDEF;

  адрес буфера - длинное  слово,  содержащее  предоставляемый

       пользователем  адрес  буфера,  в   который   программа

       $GETDVI должна записывать информацию;

  адрес возвращаемой длины - длинное слово, содержащее предо-

       ставляемый пользователем адрес слова, в котором  прог-

       рамма $GETDVI пишет длину в байтах реально  возвращае-

       мой информации.

       Коды элементов программы $GETDVI:

  DVI$_ACPPID - если задан данный код, то  программа  $GETDVI

       возвращает идентификатор (PID) программы  ACP  в  виде

       четырехбайтового шеснадцатиричного числа;

  DVI$_ACPTYPE - если задан данный код, то программа  $GETDVI

       возвращает код типа ACP в виде четырехбайтового  шест-

       надцатиричного числа.  Следующие  символические  имена

       определяют коды типа  ACP,  которые  может  возвращать




                           - 745 -

                        00152-01 97 06


       Программа $GETDVI:

             1) DVI$C_ACP_F11V1 - файловая структура уровня

       1;

             2) DVI$C_ACP_F11V2 - файловая структура уровня

       2;

             3) DVI$C_ACP_MTA - магнитная лента;

             4) DVI$C_ACP_NET - сети;

             5) DVI$C_ACP_REM  - удаленный ввод-вывод;

  DVI$_ALLDEVNAM - если указан этот код, то программа $GETDVI

       возвращает   64-байтовую   шестнадцатиричную   строку,

       содержащую строку "класс-распределение-имя-устройства"

       уникально  идентифицирует  каждое  устройство.  Строку

       "класс-распределение-имя- устройства" можно, например,

       использовать в приложении, в котором требуется коорди-

       нировать доступ процессов к устройствам (не к  томам),

       применяя управление захватом операционной системы  МОС

       ВП. В данном случае программа могла  бы  сделать  уст-

       ройство ресурсом для управления захватом  системы  МОС

       ВП, задавая в качестве имени ресурса  следующие  сцеп-

       ленные компонетны:

             1) префикс - средство пользователя, за которым

       следует символ подчеркивания;

             2) "класс-распределение-имя-устройства"  этого

       устройства.   Имя,   возвращаемое    кодом    элемента

       DVI$_DEVLOCKNAM можно использовать для координации до-

       ступа к томам;






                           - 746 -

                        00152-01 97 06


  DVI$_CLUSTER - если задан данный код, то программа  $GETDVI

       возвращает размер кластеров томов в  виде  4-байтового

       десятичного чиса. Данный код относится только  к  дис-

       кам;

  DVI$_CYLINDERS - если  задан   данный   код,  то  программа

       $GETDVI возвращает число  цилиндров  на  томе  в  виде

       4-байтового  десятичного  числа.  Этот  код  относится

       только к дискам;

  DVI$_DEVBUFSIZ - если   задан  данный  код,   то  программа

       $GETDVI возвращает размер буфера устройства (например,

       ширину строки терминала или размер блока на  ленте)  в

       виде 4-байтового десятичного числа;

  DVI$_DEVCHAR - если задан данный код, то  программа $GETDVI

       возвращает характеристики, не зависящие от устройства,

       в виде 4-байтового вектора битов. Каждая характеристи-

       ка представляется битом. Если программа $GETDVI  уста-

       навливает этот бит, то устройство имеет  соответствую-

       щую характеристику. Каждый бит в векторе имеет  симво-

       лическое имя. Данные символические имена  определяются

       с помощью макрокоманды $DEVDEF:

            1) DEV$V_REC - устройство  ориентировано на запи-

       си;

            2) DEV$V_CCL - устройство  с  управлением  карет-

       кой;

            3) DEV$V_TRM - устройство является терминалом;

            4) DEV$V_DIR - устройство  со  структурой катало-

       га;




                           - 747 -

                        00152-01 97 06


            5) DEV$V_SDI - устройство  со  структурой  одного

                            каталога;

            6) DEV$V_SQD - устройство  является  последовате-

       льным и ориентированным на блоки;

            7) DEV$V_SPL - устройство со спулингом;

            8) DEV$V_OPR - устройство для оператора;

            9) DEV$V_RCT - диск содержит RCT;

           10) DEV$V_NET - устройство   устройство   является

       устройством сети;

           11) DEV$V_FOD - устройство ориентировано на файлы;

           12) DEV$V_DUA - устройство с двумя портами;

           13) DEV$V_SHR - разделяемое устройство;

           14) DEV$V_GEN - обобщенное устройство;

           15) DEV$V_AVL - устройство доступно для  использо-

       вания;

           16) DEV$V_MNT - устройство смонтировано;

           17) DEV$V_MBX - устройство является почтовым  ящи-

       ком;

           18) DEV$V_DMT - устройство помечено  для  демонти-

       рования;

           19) DEV$V_ELG - устройство с включенной  регистра-

       цией ошибок;

           20) DEV$V_ALL - устройство распределено;

           21) DEV$V_FOR - устройство смонтировано как чужое;

           22) DEV$V_SWL - устройство программно заблокирова-

       но от записи;

           23) DEV$V_IDV - устройство может обеспечить ввод;




                           - 748 -

                        00152-01 97 06


           24) DEV$V_ODV - устройство может обеспечить вывод;

           25) DEV$V_RND - устройство допускает  произвольный

       доступ;

           26) DEV$V_RTM - устройство реального времени;

           27) DEV$V_RCK - устройство имеет средство контроля

       чтения;

           28) DEV$V_WCK - устройство имеет средство  контро-

       ля записи.

       Каждая  из  перечисленных  характеристик  имеет   свой

  собственный код программы $GETDVI в формате DVI$-XXXX,  где

  "XXXX" - это символы, следующие за симвлолом  подчеркивания

  для имени этой характеристики устройства.

       Например, если задан код элемента DVI$V_REC, то  прог-

  рамма $GETDVI возвращает длинное слово,  значение  которого

  интерпретируется как булево.  Если  данное  значение  равно

  нулю, то устройство не ориентировано на записи, если значе-

  ние равно 1, то устройство ориентировано на записи.  Данная

  информация  идентична  той,  которая  возвращается  в  бите

  DEV$V_REG   динного   слова   вектора,   заданного    кодом

  DVI$_DEVCHAR.

       Все данные коды характеристик устройств требуют, чтобы

  для буфера было задано длинное слово;

  DVI$DEVCHAR2 - если задан этот код,  то  программа  $GETDVI

       возвращает дополнительные характеристики, не зависящие

       от устройства, в виде 4-байтового вектора битов.  Каж-

       дый бит в векторе, если он  установлен,  соответствует

       символическому имени. Данные символические имена опре-




                           - 749 -

                        00152-01 97 06


       Деляются макрокомандой $DEVDEF;

  DVI$_DEVCLASS - если задан данный код, то программа $GETDVI

       возвращает класс устройства в виде  4-байтового  деся-

       тичного числа. Данные символические имена определяются

       макрокомандой $DCDEF:

            1) DC$_DISK - дисковое устройство;

            2) DC$_TAPE - ленточное устройство;

            3) DC$_SCOM - устройство синхронных коммуникаций;

            4) DC$_CARD - устройство чтения с перфокарт;

            5) DC$_TERM - терминал;

            6) DC$_LP - построчно печатающее устройство;

            7) DC$_REALTIME - реальное время;

            8) DC$_MAILBOX - почтовый ящик;

            9) DC$_MISC - остальные устройства;

  DVI$_DEVDEPEND - если   задан   данный   код, то  программа

       $GETDVI возвращает характеристики, зависящие  от  уст-

       ройства, в виде 4-байтового вектора битов  (см.  Доку-

       мент [2]).

       Только для терминалов отдельные коды  элементов  прог-

  раммы $GETDVI  обеспечены  для  большинства  информационных

  элементов, которые возвращаются  в  длинном  слове  вектора

  битов DVI$_DEVDEPEND. Имена данных элементных  кодов  имеют

  формат DVI$_TT_XXXX, где "XXXX" является именем характерис-

  тики. То же самое имя характеристики  следует  за  символом

  подчеркивания в символическом имени для каждого  бита  (имя

  определяется  макрокомандой   $TTDEF)   в   длинном   слове

  DVI$_DEVDEPEND. Например, код DVI$_TT_NOECHO возвращает  ту




                           - 750 -

                        00152-01 97 06


  же  информацию,  которая  возвращается   в   бите   вектора

  DVI$_DEVDEPEND, имя которого TT$V_NOECHO.

       Каждый такой код требует, чтобы буфер задавался в виде

  длинного слова, которое интерпретируется как булево  значе-

  ние. Значение 0 указывает, что  терминал  не  имеет  данной

  характеристики, значение 1 указывает, что имеет.

       В  конце  списка  кодов  элементов  приводится  список

  кодов, специфичных для терминалов;

  DVI$_DEVDEPEND2 - если  указан  данный  код,  то  программа

       $GETDVI  возвращает   дополнительные   характеристики,

       зависящие от устройства, в  виде  4-байтового  вектора

       битов (см. документ [2]).

       Только для терминалов отдельные коды элементов,  прог-

  раммы $GETDVI  обеспечены  для  большинства  информационных

  элементов, которые возвращаются  в  длинном  слове  вектора

  битов DVI$_DEVDEPEND2. Как описано для кода  DVI$DEVDEPEND,

  то же символическое имя для каждого бита  в  длинном  слове

  DVI$DEVDEPEND2, за исключением того, что  в  данном  случае

  символические имена для  битов  определяются  макрокомандой

  $TT2DEF.

       В списке кодов элементов приводится список кодов, спе-

  цифичных для терминалов;

  DVI$_DEVLOCKNAM - если   указан   этот   код,  то программа

       $GETDVI  возвращает  имя  захвата  устройства  в  виде

       64-байтовой шестнадцатиричной строки. Имя захвата уст-

       ройства уникально идентифицирует каждый том или группу

       томов. Данный код относится только к дискам.




                           - 751 -

                        00152-01 97 06


       Данный элементный код относится к любым дисковым томам

  или наборам томов: смонтированным общими, личными или чужи-

  ми.

       Имя захвата  устройства  назначается  тому,  когда  он

  впервые монтируется, и данное имя не может  быть  изменено,

  даже если меняется имя самого тома.  Это  позволяет  любому

  процессу получить доступ  к  уникально  идентифицированному

  тому.

       Имя захвата устройства можно, например, использовать в

  приложении, в котором требуется координировать доступ  про-

  цессов к файлам, применяя управление захватом  операционной

  системы МОС ВП. В данном случае программа могла бы  сделать

  файл  ресурсом,  который  должен  захватываться  указав   в

  качестве имени  ресурса  следующие  сцепленные  компоненты:

  префикс средства пользователя, за  которым  следует  символ

  подчеркивания, имя захвата устройства для тома, на  котором

  расположен файл и идентификатор файла.

  DVI$DEVNAM - если указан  данный  код, то программа $GETDVI

       возвращает имя устройства в виде 64-байтовой строки  с

       дополнительными нулями. Имя узла не устанавливается;

  DVI$_DEVSTS - если задан данный код, то  программа  $GETDVI

       возвращает информацию  состояния,  зависящую  от  уст-

       ройства, в виде 4-байтового вектора битов. Символичес-

       кие имена для битов состояния определяются макрокоман-

       дой $UCBDEF (см. Документ [2]);

  DVI$_DEVTYPE - если указан данный код, то программа $GETDVI

       возвращает тип устройства в виде 4-байтового  десятич-




                           - 752 -

                        00152-01 97 06


       ного числа. Символические имена для  этих  типов  уст-

       ройств определяются макрокомандой $DCDEF;

  DVI$_ERRCNT - если указан данный код, то программа  $GETDVI

       возвращает  счетчик  ошибок  в   устройстве   в   виде

       4-байтового десятичного числа;

  DVI$_FREEBLOCKS - если  указан  данный  код,  то  программа

       $GETDVI  возвращает  число  блоков  на  диске  в  виде

       4-байтового десятичного числа. Этот код элемента отно-

       сится только к дискам;

  DVI$_FULLDEVNAM - если   задан  данный  код,  то  программа

       $GETDVI возврашает имя узла и  имя  устройтва  в  виде

       64-байтовой строки с дополняющими нулями.

       Буфер должен задавать длинное слово, в  котором  прог-

  рамма $GETDVI возвращает 4-байтовый шестнадцатиричный иден-

  тификатор захвата;

  DVI$_LOGVOLNAM - если   указан  данный  код,  то  программа

       $GETDVI возвращает  логическое  имя  тома  или  группы

       Томов в виде 64-байтовой строки;

  DVI$_MAXBLOCK - если   указан  данный  код,  то   программа

       $GETDVI возвращает максимальное число блоков на томе в

       виде 4-байтового десятичного числа. Данный код элемен-

       та относится только к дискам;

  DVI$_MAXFILES - если  указан   данный  код,  то   программа

       $GETDVI возвращает максимальное число файлов на томе в

       виде 4-байтового десятичного числа. Данный код элемен-

       та относится только к дискам;






                           - 753 -

                        00152-01 97 06


  DVI$_MOUNTCNT - если   указан  данный  код,  то   программа

       $GETDVI возвращает счетчик монтирований  тома  в  виде

       4-байтового десятичного числа;

  DVI$_NEXTDEVNAM - если  указан  данный   код, то  программа

       $GETDVI возвращает имя устройства для следующего  тома

       в группе томов в виде 64-байовой строки с дополняющими

       Нулями. Данный код относится только к дискам;

  DVI$_OPCNT - если указан данный код, то  программа  $GETDVI

       возвращает  счетчик   операций   для   тома   в   виде

       4-байтового десятичного числа;

  DVI$_OWNUIC - если указан данный код, то программа  $GETDVI

       возвращает код идентификации пользователя  (UIC)  вла-

       дельца устройства в виде стандартного 4-байтового кода

       UIC операционной системы МОС ВП;

  DVI$_PID - если указан данный код, то программа $GETDVI во-

       звращает идентификатор процесса (PID)  владельца  уст-

       ройства в виде 4-байтового шестнадцатиричного числа;

  DVI$_RECSIZ - если указан данный код, то программа  $GETDVI

       возвращает размер записи в виде 4-байтового десятиного

       числа;

  DVI$_REFCNT - если  указан данный код, то программа $GETDVI

       возвращает число каналов,  назначенных  устройству,  в

       виде 4-байтового десятичного числа;

  DVI$_ROOTDEVNAM - если  указан  данный  код,  то  программа

       $GETDVI возвращает имя устройства  корневого  тома  из

       группы томов в виде 64-байтовой строки с  дополняющими

       нулями. Данный код элемента относитмя только к дискам;




                           - 754 -

                        00152-01 97 06


  DVI$_SECTORS - если указан данный код, то программа $GETDVI

       возвращает  число   секторов   на   дорожке   в   виде

       4-байтового десятичного  числа.  Данный  код  элемента

       относится только к дискам;

  DVI$_SERIALNUM - если  указан  данный  код,  то  программа

       $GETDVI  возвращает  серийный  номер   тома   в   виде

       4-байтового десятичного числа. Этот код элемента отно-

       сится только к дискам;

  DVI$_STS - если указан данный код, то программа $GETDVI во-

       звращает состояние устройства в виде 4-байтового  век-

       тора битов. Каждый бит в векторе, если он  установлен,

       соответствует символическому  имени,  которое  опреде-

       ляется макрокомандой $UCBDEF. Следующий список  описы-

       вает каждое такое имя:

            1) UCB$V_TIM - разрешен тайм-аут;

            2) UCB$V_INT - ожидается прерывание;

            3) UCB$V_ERLOGIP - на устройстве идет регистрация

       ошибки;

            4) UCB$V_CANCEL - отменить ввод-вывод на  устрой-

       стве;

            5) UCB$V_ONLINE - устройство в оперативном состо-

       янии;

            6) UCB$V_POWER - при занятом устройстве включение

       закончилось неудачно;

            7) UCB$V_TIMOUT - тайм-аут;

            8) UCB$V_INTTYPE - приемник в состоянии  прерыва-

       ния;




                           - 755 -

                        00152-01 97 06


            9) UCB$V_BSY - устройство занято;

            10) UCB$V_MOUNTING - устройство монтируется;

            11) UCB$V_DEADMO - освободить при демонтировании;

            12) UCB$V_VALID - том имеет правильный формат с

       точки зрения программного обеспечения;

            13) UCB$V_UNLOAD - разгрузить том при  демонтиро-

       вании;

            14) UCB$V_TEMPLATE - этот блок UCB является  шаб-

       лонным блоком UCB, из которого получаются другие  бло-

       ки UCB для данного типа устройства;

            15) UCB$V_MNTVERIP - выполняется проверка  монти-

       рования;

            16) UCB$V_WRONGVOL - во время  проверки  монтиро-

      вания обнаружен негодный том;

            17) UCB$V_DELETEUCB - удалить этот блок UCB,  ес-

      ли счетчик обращений равен 0;

  DVI$_TRACKS - если задан  данный  код, то программа $GETDVI

       возвращает  число   дорожек   на   цилиндре   в   виде

       4-байтового десятичного  числа.  Данный  код  элемента

       относится только к дискам;

  DVI$_TRANSCNT - если задан данный код, то программа $GETDVI

       возвращает  счетчик  транзакций  для   тома   в   виде

       4-байтового десятичного числа;

  DVI$_TT_PHYDEVNAM - если задан  данный  код,  то  программа

       $GETDVI возвращает имя физического устройства, связан-

       ное с номером канала или имя  виртуального  терминала.

       Если вызывающий процесс указывает устройство, отличное




                           - 756 -

                        00152-01 97 06


       от виртуального терминала, то программа $GETDVI  возв-

       ращает пустую строку. Программа возвращает  имя  физи-

       ческого устройства в виде 64-байтовой строки с  допол-

       няющими нулями;

  DVI$_UNIT - если задан данный код, то программа $GETDVI во-

       звращает номер устройства в виде 4-байтового  десятич-

       ного числа;

  DVI$_VOLCOUNT - если задан данный код, то программа $GETDVI

       возвращает число томов в виде 4-байтового  десятичного

       числа. Данный код элемента относится только к дискам;

  DVI$_VOLNAM - если задан данный код, то  программа  $GETDVI

       возвращает имя тома в виде 12-байтовой строки с допол-

       няющими нулями;

  DVI$_VOLNUMBER - если   задан  данный  код,  то   программа

       $GETDVI возвращает номер данного тома в группе томов в

       виде 4-байтового десятичного числа. Данный код элемен-

       та относится только к дискам;

  DVI$_VOLSETMEM - если задан   данный   код,   то  программа

       $GETDVI возвращает длинное слово, содержимое  которого

       интерпретируется как булево.  Значение  1  индицирует,

       что устройство входит в группу томов. Значение 0 инди-

       цирует, что устройство не входит в группу томов.  Дан-

       ный код элемента относится только к дискам;

  DVI$_VPROT - если  задан  данный  код, то программа $GETDVI

       возвращает  маску  защиты  тома  в  виде   стандартной

       4-байтовой маски;






                           - 757 -

                        00152-01 97 06


  DVI$_TT_XXXX - данный код является  форматом  группы  кодов

       элементов, которые возвращают информацию о терминалах.

       Данная информация состоит из характеристик терминалов.

       часть имени кода вида "XXXX" задает отдельную характе-

       ристику терминала.

       Каждый из этих элементных кодов требует,  чтобы  буфер

  задавал длинное слово, в котором программа $GETDVI пишет  0

  или 1 (0 если терминал не имеет данной характеристики, и  1

  - если терминал  имеет  эту  характеристику).  Единственным

  исключением является код элемента DVI$_TT_PAGE. Если указан

  данный код, то программа $GETDVI возвращает длинное  слово,

  содержащее десятичное значение, означающее размер  страницы

  данного терминала.

       Данная информация, специфичная для терминалов, доступ-

  на также при использовании элементных кодов  DVI$_DEVDEPEND

  и DVI$_DEVDEPEND2. Каждый из данных  двух  кодов  элементов

  задает вектор битов размером в длинное  слово.  Каждый  бит

  данного  вектора  соответствует  характеристике  терминала.

  Программа $GETDVI  устанавливает  соответствующий  бит  для

  каждой характеристики, которой обладает терминал.

       Коды элементов программы $GETDVI, относящиеся к терми-

       налам:

            1) DVI$_TT_NOECHO;      25) DVI$_TT_NOTYPEAHD;

            2) DVI$_TT_HOSTSYNC;    26) DVI$_TT_TTSYNC;

            3) DVI$_TT_ESCAPE;      27) DVI$_TT_LOWER;

            4) DVI$_TT_MECHTAB;     28) DVI$_TT_WRAP;

            5) DVI$_TT_LFFILL;      29) DVI$_TT_SCOPE;




                           - 758 -

                        00152-01 97 06


            6) DVI$_TT_CRFILL;      30) DVI$_TT_SETSPEED;

            7) DVI$_TT_EIGHTBIT;    31) DVI$_TT_MBXDSABL;

            8) DVI$_TT_READSYNC;    32) DVI$_TT_MECHFORM;

            9) DVI$_TT_NOBRDCST;    33) DVI$_TT_HALFDUP;

            10) DVI$_TT_MODEM;      34) DVI$_TT_OPER;

            11) DVI$_TT_LOCALECHO;  35) DVI$_TT_AUTOBAUD;

            12) DVI$_TT_PAGE;       36) DVI$_TT_HANGUP;

            13) DVI$_TT_MODHANGUP;  37) DVI$_TT_BRDCSTMBX;

            14) DVI$_TT_DMA;        38) DVI$_TT_ALTYPEAHD;

            15) DVI$_TT_ANSICRT;    39) DVI$_TT_REGIS;

            16) DVI$_TT_AVO;        40) DVI$_TT_EDIT;

            17) DVI$_TT_BLOCK;      41) DVI$_TT_DECCRT;

            18) DVI$_TT_EDITING;    42) DVI$_TT_INSERT;

            19) DVI$_TT_DIALUP;     43) DVI$_TT_SECURE;

            20) DVI$_TT_FALLBACK;   44) DVI$_TT_DISCONNECT;

            21) DVI$_TT_PASTHRU;    45) DVI$_TT_SIXEL;

            22) DVI$_TT_PRINTER;    46) DVI$_TT_APP_KEYPAD;

            23) DVI$_TT_DRCS;       47) DVI$_TT_SYSPWD;

            24) DVI$_TT_DECCRT;

  DVI$_YYYY - данный код является форматом для  группы  кодов

       элементов, которые возвращают характеристики устройст-

       ва, не зависящие от конкретного устройства. Для каждой

       характеристики устройства  имеется  свой  код.  Данные

       характеистики возвращаются в векторе битов размером  в

       длинное слово, который задается кодом DVI$_DEVCHAR.

       В описании кода элемента DVI$_DEVCHAR приведен  список

  символических имен, каждое из которых представляет характе-




                           - 759 -

                        00152-01 97 06


  ристику устройства.  Чтобы  сконструировать  код  программы

  $GETDVI для  каждой  характеристики  устройства  необходимо

  заменить символы "YYYY" той  частью  символического  имени,

  которая следует за символом подчеркивания.  Например,  эле-

  ментный код DVI$_REC возвращает ту же информацию, что и бит

  DEV$V_REC в длинном слове вектора битов DVI$_DEVCHAR.

       Буфер для каждого из этих кодов элементов должен зада-

  вать значение в длинном слове, которое интерпретируется как

  булево. Программа $GETDVI пишет значение 1  в  это  длинное

  слово, если устройство имеет указанную характеристику, и 0,

  если не имеет.

       IOSB (блок состояния ввода-вывода)

       Использование в МОС ВП: IO_STATUS_BLOCK

       Тип:                    квадрослово (без знака)

       Доступ:                 только запись

       Механизм:               по ссылке

       Блок состояния ввода-вывода,  в  который  записывается

  состояние завершения. Аргумент IOSB является адресом  квад-

  рослова, содержащего блок состояния ввода-вывода.

       Если указан аргумент IOSB, то при инициализации запро-

  са  программа  $GETDVI  устанавливает   в   блок   состония

  ввода-вывода нули. После  завершения  обработки  запроса  в

  первом длинном слове  возвращается  код  состояния,  второе

  длинное слово зарезервировано.










                           - 760 -

                        00152-01 97 06


       Хотя  данный  аргумент  является  необязательным,  его

  рекомендуется задавать по следующим причинам:

       1) если для сигнализации о завершении  программы  сис-

  темного обслуживания используется флаг  событий,  то  можно

  проверить в блоке состояния ввода-вывода значение кода сос-

  тояния, чтобы удостовериться, что флаг  не  был  установлен

  каким-либо другим событием, отличным от завершения програм-

  мы;

       2) если для синхронизации завершения программы систем-

  ного обслуживания используется программа  $SYNCH,  то  блок

  состояния ввода-вывода является обязательным аргументом для

  этой программы;

       3) значение кода состояния, возвращаемое в регистре R0

  и значение кода состояния, возвращаемое в  блоке  состояния

  ввода-вывода, дают информацию о различных  аспектах  вызова

  программы системного обслуживания  $GETDVI.  Значение  кода

  состояния, возвращаемое в регистре R0, дает  информацию  об

  успешном или неуспешном вызове программы, а  значение  кода

  состояния, возвращаемое  в  блоке  состояния  ввода-вывода,

  дает информацию об успешном или неуспешном выполнении  опе-

  рации программы  системного  обслуживания.  Таким  образом,

  чтобы получить точную информацию о результате  обращения  к

  программе $GETDVI, необходимо проверять значения кодов сос-

  тояния, возвращаемые как в регистре R0 так и в  блоке  сос-

  тояния ввода-вывода.








                           - 761 -

                        00152-01 97 06


       ASTADR

       Использование в МОС ВП: AST_PROCEDURE

       Тип:                    маска программы

       Доступ:                 вызов без развертывания стека

       Механизм:               по ссылке

       Подпрограмма обработки AST, которая должна выполняться

  после завершения программы $GETDVI. Аргумент ASTADR являет-

  ся адресом маски входа данной подпрограммы.

       Если задан аргумент ASTADR, то программа обработки AST

  будет выполняться с тем же режимом доступа, что и  програм-

  ма, вызывавшая программу $GETDVI.

       ASTPRM

       Использование в МОС ВП: USER_ARG

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Параметр AST, который  должен  передаваться  программе

  обработки AST, заданной аргументом ASTADR. Аргумент  ASTPRM

  представляет из себя длинное слово, содержащее данный пара-

  метр.

       NULLARG

       Использование в МОС ВП: NULL_ARG

       Тип:                    квадрослово (без знака)

       Доступ:                 только чтение

       Механизм:               по ссылке

       Аргумент, занимающий место в списке аргументов.






                           - 762 -

                        00152-01 97 06


  описание

       Аргумент CHAN можно использовать только если канал уже

  назначен и режим доступа  вызывающего  процесса  равен  или

  более привилегирован, чем режим доступа процесса, из  кото-

  рого первоначально был назначен канал.

       Процесс, вызывающий программу $GETDVI, не  обязательно

  должен иметь канал, назначенный тому устройству, о  котором

  требуется получить информацию.

       Программа системного обслуживания  $GETDVI  возвращает

  информацию как о первичных характеристиках, так и о вторич-

  ных  характеристиках  устройства.  По  умолчанию  программа

  $GETDVI возвращает информацию только о  первичных  характе-

  ристиках устройства.

       Чтобы получить информацию о вторичных  характеристиках

  устройства, необходимо соединить логической операцией "или"

  код  элемента,   задающий   желаемую   информацию   и   код

  DVI$C_SECONDARY.

       Информация о  первичных  и  вторичных  характеристиках

  устройств может  быть  получена  за  один  вызов  программы

  $GETDVI.

       В большинстве случаев две группы  характеристик  (пер-

  вичные и вторичные), возвращаемые программой $GETDVI, иден-

  тичны.  Однако,  эти  две  группы  предоставляют  различную

  информацию в следующих случаях:

       1) если устройство имеет подсоединенный почтовый ящик,

  то первичные характеристики относятся к  назначенному  уст-

  ройству, а вторичные характеристики относятся  к  подсоеди-




                           - 763 -

                        00152-01 97 06


  ненному к нему почтовому ящику;

       2) если устройство работает в режиме спулинга, то пер-

  вичные характеристики относятся к промежуточному устройству

  (такому как диск), а вторичные характеристики  относятся  к

  устройству спулинга (такому как печатающее устройство);

       3) если устройство  представляет  логическую  связь  в

  сети, то вторичные характеристики  содержат  информацию  об

  этой связи.

       Возвращаемые значения кода состояния:

       SS$_NORMAL -    успешное завершение прогрограммы  сис-

                       темного обслуживания;

       SS$_ACCVIO -    вызывающий процесс не может  прочитать

                       дескриптор строки имени устройства или

                       аргумент ITMLST, или не может записать

                       в длинное слово буфера или  возвращае-

                       мой длины;

       SS$_BADPARAM -  список элементов содержит неверный код

                       элемента; или поле "адрес возвращаемой

                       длины" в дескрипторе  элемента  задает

                       менее четырех байтов для информации  о

                       возвращаемой длине;

       SS$_EXASTLM -   процесс превысил свою квоту;

       SS$_IVCHAN -    указан неверный номер канала, то  есть

                       номер канала больше числа каналов;

       SS$_IVDEVNAM -  строка   имени   устройства   содержит

                       неверные символы;  либо  не  задан  ни

                       аргумент DEVNAM, ни аргумент CHAN;




                           - 764 -

                        00152-01 97 06


       SS$_IVLOGNAM -  строка имени устройства имеет длину  0

                       или более 63 символов;

       SS$_NONLOCAL -  предупреждение. Устройство находится в

                       удаленной системе;

       SS$_NOPRIV -    указанный канал не  назначен  или  был

                       назначен из  более  привилегированного

                       режима доступа;

       SS$_NOSUCHDEV - предупреждение. Указанного  устройства

                       нет в системе.

       Значения кода состояния, возвращаемые в блоке  состоя-

  ния ввода-вывода совпадают со значениями,  возвращаемыми  в

  регистре R0.



       13.57. $GETDVIW  -  получить   информацию   об

              устройстве/томе и ждать


       Программа системного обслуживания $GETDVIW  возвращает

  информацию об устройстве  ввода-вывода.  Данная  информация

  состоит из первичных и вторичных характеристик устройства.

       Программа системного обслуживания $GETDVIW завершается

  синхронно, то есть  она  возвращает  управление  вызвавшему

  процессу вместе с затребованной информацией.

       Для асинхронного  завершения  необходимо  использовать

  программу системного обслуживания "получить  информацию  об

  устройстве/томе" ($GETDVI), которая  возвращает  управление

  вызвавшему процессу, поставив запрос на информацию  в  оче-

  редь и не ожидая возврата информации.





                           - 765 -

                        00152-01 97 06


       Во всех  остальных  отношениях  программы  $GETDVIW  и

  $GETDVI идентичны. Всю  остальную  информацию  о  программе

  $GETDVIW можно получить в описании программы  $GETDVI  (см.

  подраздел 2.5).

       Формат:

       SYS$GETDVIW   [EFN],[CHAN],[DEVNAM],ITMLST,[IOSB]

                     ,[ASTADR],[ASTPRM],NULLARG



       13.58. $GETJPI - получить информацию о задании

              или процессе


       Программа системного обслуживания  $GETJPI  возвращает

  информацию об одном или нескольких процессах в системе.

       Программа системного обслуживания $GETJPI  выполняется

  асинхронно; то есть, она возвращает управление  вызывающему

  процессу после постановки в очередь  запроса  на  получение

  информации.

       Для  синхронного  выполнения  необходимо  использовать

  программу системного обслуживания  "получить  информацию  о

  задании или процессе и ждать" ($GETJPIW). Программа систем-

  ного обслуживания $GETJPIW во всем идентична программе сис-

  темного обслуживания $GETJPI кроме того, что GETJPIW  возв-

  ращает управление вызывающему процессу вместе с запрошенной

  информацией (подраздел 2.5).











                           - 766 -

                        00152-01 97 06


       Формат:

       SYS$GETJPI    [EFN],[PIDADR],[PRCNAM],ITMLST,

                     [IOSB],[ASTADR],[ASTPRM]

       Аргументы:

       EFN

       Использование в МОС ВП: EF_NUMBER

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Номер флага события,  который  необходимо  установить,

  когда $GETJPI возвращает запрошенную  информацию.  Аргумент

  EFN - это длинное слово, содержащее данный номер.

       При инициации запроса $GETJPI очищает  указанный  флаг

  события (либо флаг события 0, если аргумент EFN не  задан).

  Потом, когда $GETJPI возвращает запрошенную информацию, она

  устанавливает указанный флаг события (либо флаг события 0).

       PIDADR

       Использование в МОС ВП: PROCESS_ID

       Тип:                    длинное слово (без знака)

       Доступ:                 модификация

       Механизм:               по ссылке

       Идентификатор процесса  (PID),  информацию  о  котором

  возвращает $GETJPI. Аргумент PIDADR -  это  адрес  длинного

  слова, содержащего PID.

       Если аргумент PIDADR задан как минус единица, то прог-

  рамма $GETJPI возвращает запрошенную  информацию  обо  всех

  процессах в системе, на доступ к которым  имеется  привиле-




                           - 767 -

                        00152-01 97 06


  гия, по одному процессу за  вызов.  Чтобы  выполнить  такую

  операцию, пользователь должен  вызывать  $GETJPI  в  цикле,

  проверяя после каждого вызова код возврата. Если код  возв-

  рата равен SS$_NOMOREPROC, то необходимо осуществить  выход

  из цикла.

       PRCNAM

       Использование в МОС ВП: PROCESS_NAME

       Тип:                    строка текста

       Доступ:                 только чтение

       Механизм:               по дескриптору - дескриптор

                               строки с фиксированной длиной

       Имя процесса,  информацию  о  котором  должна  вернуть

  программа $GETJPI. Аргумент PRCNAM - это адрес дескриптора,

  указывающего на строку данного имени.

       Строка имени процесса должна содержать от 1 до 15 сим-

  волов и должна точно соответствовать имени процесса; пробе-

  лы в конце или сокращения не допускаются.

       Аргумент PPCNAM можно использовать в том случае,  если

  процесс, задаваемый аргументом PRCNAM, имеет тот  же  номер

  группы UIC, что и вызывающий процесс.  Если  процесс  имеет

  другой номер группы, то $GETJPI не  возвращает  информацию.

  Чтобы получть информацию о  процессах,  входящих  в  другие

  группы, необходимо использовать аргумент PIDADR.

       ITMLST

       Использование в МОС ВП: ITEM_LIST_3

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение




                           - 768 -

                        00152-01 97 06


       Механизм:               по ссылке

       Список элементов,  определяющих,  какую  информацию  о

  процессе (или процессах) требуется вернуть. Аргумент ITMLST

  - это адрес списка дескрипторов элементов, каждый из  кото-

  рых описывает некоторый элемент информации. Список дескрип-

  торов элементов заканчивается длинным словом, содержащим 0.

  Формат дескриптора элемента приведен на рис.65.


                      Дескриптор элемента

       31                       15                          0
       ------------------------------------------------------
       !       Код элемента     !    Длина буфера           !
       ------------------------------------------------------
       !                  Адрес буфера                      !
       ------------------------------------------------------
       !        Адрес длины возвращаемой информации         !
       ------------------------------------------------------

                           Рис. 65

       Поля дескриптора элемента программы $GETJPI следующие:

  длина буфера -

       слово, содержащее заданное пользователем целое  значе-

       ние, которое указывает длину (в байтах) буфера,  пред-

       назначенного для записи информации программой $GETJPI.

       Требуемая длина буфера зависит от кода элемента,  ука-

       занного в поле "код  элемента"  дескриптора  элемента.

       Если значение длины буфера слишком мало, $GETJPI возв-

       ращает усеченные данные;

  код элемента -

       слово, содержащее заданный пользователем символический

       код, определяющий элемент информации,  который  должна

       вернуть программа $GETJPI. Этот код определяет  макро-




                           - 769 -

                        00152-01 97 06


       Команду $JPIDEF;

  адрес буфера -

       длинное  слово,  содержащее  записанный  пользователем

       адрес буфера, в который $GETJPI должна записать инфор-

       мацию;

  адрес длины возвращаемой информациии -

       длинное слово, содержащее заданный пользователем адрес

       слова, в которое $GETJPI  записывает  длину  в  байтах

       фактически возвращенной информации;

       Коды элементов:

  JPI$_ACCOUNT -

       когда  указан  код  JPI$_ACCOUNT,  $GETJPI  возвращает

       учетное имя устройства, которое представляет строку из

       8 байтов,  дополненную,  если  необходимо,   пробелами

       справа;

  JPI$_APTCNT -

       когда указан код JPI$_APTCNT, $GETJPI возвращает счет-

       чик таблицы активных страниц процесса, который  предс-

       тавляет десятичное значение размером в длинное слово;

  JPI$_ASTACT -

       когда задан код JPI$_ASTACT, $GETJPI возвращает назна-

       чения режимов доступа, имеющих  активные  AST.  Данная

       информация возвращается в битовый  вектор  размером  в

       длинное слово. Если установлен бит 0, то сущестует AST

       режима ядра; бит 1 - AST режима управления;  бит  2  -

       AST супервизорного режима; и бит  3  -  AST  пользова-

       тельского режима;




                           - 770 -

                        00152-01 97 06


  JPI$_ASTCNT -

       когда задан код JPI$_ASTCNT, $GETJPI возвращает  счет-

       чик остающейся квоты AST, который  представляет  деся-

       тичное значение в длнное слово;

  JPI$_ASTEN -

       когда задан код JPI$_ASTEN, $GETJPI возвращает  назва-

       ния режимов  доступа,  имеющих  разрешенные  AST.  Эта

       информация возвращается в битовый  вектор  размером  в

       длинное слово. Если установлен бит 0,  то  разрешенное

       AST имеет режим ядра; бит 1 - режим управления; бит  2

       - супервизорный режим;  и  бит  3  -  пользовательский

       режим;

  JPI$_ASTLM -

       когда задан код JPI$_ASTLM, $GETJPI  возвращает  квоту

       предела AST  данного  процесса,  которая  представляет

       десятичное значение размером в длинное слово;

  JPI$_AUTHPRI -

       когда задан код JPI$_AUTHPRI, $GETJPI возвращает авто-

       ризованный базовый приоритет процесса, который предос-

       тавляет десятичное значение размером в длинное  слово.

       Авторизованный базовый приоритет является высшим прио-

       ритетом, который может получить процесс без привилегии

       ALTPRI при помощи  программы  системного  обслуживания

       $SETPRI;

  JPI$_AUTHPRIV -

       когда задан код JPI$_AUTHPRIV, $GETJPI возвращает при-

       вилегии,  которые  даны  процессу.  Данные  привилегии




                           - 771 -

                        00152-01 97 06


       возвращаются в маску привилегий размером в квадрослово

       и определяеются при помощи макрокоманды $PRVDEF;

  JPI$_BIOCNT -

       когда задан код JPI$_BIOCNT, $GETJPI возвращает  счет-

       чик  оставшейся  квоты  буферизованного  ввода-вывода,

       который представляет десятичное  значение  размером  в

       длинное слово;

  JPI$_BIOLM -

       когда задан код JPI$_BIOLM, $GETJPI  возвращает  квоту

       предела буферизованного ввода-вывода процесса, которая

       представляет десятичное значение  размером  в  длинное

       слово;

  JPI$_BUFIO -

       когда задан код JPI$_BUFIO, $GETJPI возвращает счетчик

       операций буферизованного ввода-вывода процесса,  кото-

       рый представляет десятичное значение размером в  длин-

       ное слово;

  JPI$_BYTCNT -

       когда задан код JPI$_BYTCNT, $GETJPI возвращает остав-

       шуюся   квоту    счетчика    байтов    буферизованного

       ввода-вывода, которая представляет десятичное значение

       размером в длинное слово;

  JPI$_CHAIN -

       когда задан код JPI$_CHAIN, $GETJPI обрабатывает  дру-

       гой список элементов сразу  после  обработки  текущего

       списка. Поле "адрес  буфера"  в  дескрипторе  элемента

       задает адрес следующего списка элементов,  подлежащего




                           - 772 -

                        00152-01 97 06


       обработке. Код элемента JPI$_CHAIN должен быть послед-

       ним кодом элемента, указанным в списке элементов;

  JPI$_CLINAME -

       когда задан код JPI$_CLINAME, $GETJPI  возвращает  имя

       интерпретатора языка команд, который  процесс  исполь-

       зует в настоящее время.  Поскольку  данное  имя  может

       включать до 39 символов, поле "длина буфера"  в  деск-

       рипторе элемента должно задавать 39 байтов;

  JPI$_CPULIM -

       когда задан код JPI$_CPULIM, $GETJPI возвращает предел

       времени CPU процесса, который представляет  десятичное

       значение размером в длинное слово;

  JPI$_CPUTIM -

       когда задан код JPI$_CPUTIM, $GETJPI возвращает накоп-

       ленное время CPU процесса в 10-миллисеундных единицах,

       которое представляет десятичное  значение  размером  в

       длинное слово;

  JPI$_CREPRC_FLAGS -

       когда задан код JPI$_CREPRC_FLAGS, $GETJPI  возвращает

       флаги, заданные аргументом FLAGS в вызове $CREPRC  при

       создании данного  процесса.  Флаги  возвращаются,  как

       Вектор размером в длинное слово;

  JPI$_CURPRIV -

       когда задан код JPI$_CURPRIV, $GETJPI возвращает теку-

       щие привилегии процесса. Данные привилегии возвращают-

       ся в маску привилегий в квадрослово и определяются при

       помощи макрокоманды $PRVDEF;




                           - 773 -

                        00152-01 97 06


  JPI$_DFPFC -

       когда задан код JPI$_DFPFC, $GETJPI возвращает  приня-

       тый по умолчанию размер кластEра  страничных  отказов,

       который представляет десятичное  значение  размером  в

       длинное слово;

  JPI$_DFWSCNT -

       когда задан код JPI$_DFWSCNT, $GETJPI возвращает  при-

       нятый по умолчанию размер  рабочего  набора  процесса,

       который представляет десятичное  значение  размером  в

       длинное слово;

  JPI$_DIOCNT -

       когда задан код JPI$_DIOCNT, $GETJPI возвращает остав-

       шуюся квоту  прямого  ввода-вывода  процесса,  которая

       представляет десятичное значение  размером  в  длинное

       слово;

  JPI$_DIOLM -

       когда задан код JPI$_DIOLM, $GETJPI возвращает  предел

       квоты прямого ввода-вывода процесса, который представ-

       ляет десятичное значение размером в длинное слово;

  JPI$_DIRIO -

       когда задан код JPI$_DIRIO, $GETJPI возвращает счетчик

       операций прямого ввода-вывода процесса, который предс-

       тавляет десятичное значение размером в длинное слово;

  JPI$_EFCS -

       когда задан код JPI$_EFCS, $GETJPI возвращает  состоя-

       ние локальных флагов событий процесса с 0  по  31  как

       битовый вектор размером в длинное слово;




                           - 774 -

                        00152-01 97 06


  JPI$_EFCU -

       когда задан код JPI$_EFCU, $GETJPI возвращает  состоя-

       ние локальных флагов события процесса с 32 по  63  как

       битовый вектор размером в длинное слово;

  JPI$_EFWM -

       когда задан код JPI$_EFWM,  $GETJPI  возвращает  маску

       ожидания флагов события процесса, которая представляет

       битовый вектор размером в длинное слово;

  JPI$_ENQCNT -

       когда задан код JPI$_ENQCNT, $GETJPI возвращает остав-

       шуюся квоту запросов на захват для  данного  процесса,

       которая представляет десятичное число размером в длин-

       ное слово;

  JPI$_ENQLM -

       когда задан код JPI$_ENQLM, $GETJPI  возвращает  квоту

       запросов  на  захват  для  данного  процесса,  которая

       представляет десятичное значение  размером  в  длинное

       слово;

  JPI$_EXCVEC -

       когда задан код JPI$_EXCVEC, $GETJPI возвращает  адрес

       списка векторов исключительной  ситуации  для  данного

       процесса. Каждый вектор исключительной ситуации предс-

       тавляет длинное слово. В списке есть восемь  векторов:

       это, по порядку, первичный  и  вторичный  векторы  для

       доступа в режиме ядра, для доступа в  режиме  управле-

       ния, для доступа в супервизорном режиме и для  доступа

       в пользовательском режиме. $GETJPI  возвращает  данную




                           - 775 -

                        00152-01 97 06


       информацию только для вызывающего процесса; если задан

       данный код элемента, а заданный  процесс  не  является

       вызывающим процессом, то $GETJPI возвращает в буфер 0;

  JPI$_FILCNT -

       когда задан код JPI$_FILCNT, $GETJPI возвращает  квоту

       предела открытых файлов для процесса,  которая  предс-

       тавляет десятичное значение размером в длинное слово;

  JPI$_FILLM -

       когда задан код JPI$_FILLM, $GETJPI  возвращает  квоту

       предела открытых файлов для процесса,  которая  предс-

       тавляет значение размером в длинное слово;

  JPI$_FINALEXC -

       когда  задан  код  JPI$_FINALEXC,  $GETJPI  возвращает

       адрес  списка  окончательных  векторов  исключительной

       ситуации для данного процесса. Каждый вектор  исключи-

       тельной ситуации в списке представляет длинное  слово.

       В списке четыре вектора, по одному для каждого  режима

       доступа в следующем порядке: режим ядра, режим  управ-

       ления, супервизорный режим и  пользовательский  режим.

       $GETJPI возвращает данную информацию только для  вызы-

       вающего процесса; если задан данный  код  элемента,  а

       указанный процесс не является вызывающим процессом, то

       $GETJPI возвращает в буфер 0;

  JPI$_FREPOVA -

       когда задан код JPI$_FREPOVA, $GETJPI возвращает адрес

       первой свободной страницы в  конце  области  программы

       данного процесса (область P0);




                           - 776 -

                        00152-01 97 06


  JPI$_FREP1VA -

       когда задан код JPI$_FREP1VA, $GETJPI возвращает адрес

       первой свободной страницы в конце  области  управления

       данного процесса (область P1);

  JPI$_FREPTECNT -

       когда задан  код  JPI$_FREPTECNT,  $GETJPI  возвращает

       количество страниц, которые доступны процессу для рас-

       ширения виртуальной памяти. Данное значение  представ-

       ляет десятичное число размером в длинное слово;

  JPI$_GPGCNT -

       когда задан код JPI$_GPGCNT, $GETJPI возвращает  счет-

       чик глобальных  страниц  в  рабочем  наборе  процесса,

       который представляет десятичное  значение  размером  в

       длинное слово;

  JPI$_GRP -

       когда задан код  JPI$_GRP,  $GETJPI  возвращает  номер

       группы UIC процесса. Данное десятичное значение разме-

       ром в длинное слово;

  JPI$_IMAGECOUNT -

       когда задан код JPI$_IMAGECOUNT,  $GETJPI  возвращает,

       как десятичное  значение  размером  в  длинное  слово,

       количество образов, которые  выполнялись  для  данного

       процесса;

  JPI$_IMAGNAME -

       когда задан код JPI$_IMAGNAME, $GETJPI возвращает, как

       символьную строку, имя текущего файла образа. Посколь-

       ку имя файла образа может  включать  до  39  символов,




                           - 777 -

                        00152-01 97 06


       поле "длина  буфера"  в  дескрипторе  элемента  должно

       задавать 39 (байтов);

  JPI$_IMAGPRIV -

       когда задан код JPI$_IMAGPRIV, $GETJPI возвращает мас-

       ку размером в квадрослово, представляющую  привилегии,

       с которыми был установлен текущий образ. Если  текущий

       образ не был установлен, то $GETJPI возвращает в буфер

       0;

  JPI$_JOBPRCCNT -

       когда задан  код  JPI$_JOBPRCCNT,  $GETJPI  возвращает

       общее количество подпроцессов,  принадлежащих  данному

       заданию, которое представляет десятичное значение раз-

       мером в длинное слово;

  JPI$_LOGINTIM -

       когда задан код JPI$_LOGINTIM, $GETJPI возвращает вре-

       мя создания  процесса,  которое  является  стандартным

       64-битовым абсолютным временем;

  JPI$_MASTER_PID -

       когда задан код  JPI$_MASTER_PID,  $GETJPI  возвращает

       идентификатор процесса (PID), который является  порож-

       дающим процессом в задании. PID - это  шестнадцатерич-

       ное значение размером в длинное слово;

  JPI$_MAXDETACH -

       когда задан  код  JPI$_MAXDETACH,  $GETJPI  возвращает

       максимальное   количество   отсоединенных   процессов,

       допускаемое для имени того пользователя, который  вла-

       деет процессом, указанным  в  вызове  $GETJPI.  Данный




                           - 778 -

                        00152-01 97 06


       предел  устанавливается  в  записи  файла  авторизации

       пользователя. Данное число возвращается в  виде  деся-

       тичного значения размером в слово.  Значение  0  озна-

       чает, что для данного пользователя нет ограничений  на

       количество отсоединенных процессов;

  JPI$_MAXJOBS -

       когда задан код JPI$_MAXJOBS, $GETJPI возвращает  мак-

       симальное количество активных  процессов,  допускаемое

       для того пользователя, которому  принадлежит  процесс,

       указанный в вызове программы $GETJPI. Это для значения

       установки в  записи  файла  авторизации  пользователя.

       Данное число возвращается в виде десятичного  значения

       размером в слово. Значение 0 означает, что для данного

       пользователя нет ограничений  на  количество  активных

       процессов;

  JPI$_MEM -

       когда задан код  JPI$_MEM,  $GETJPI  возвращает  номер

       члена UIC процесса,  который  представляет  десятичное

       значение размером в длинное слово;

  JPI$_MODE -

       когда задан код JPI$_MODE,  $GETJPI  возвращает  режим

       процесса,  который  представляет  десятичное  значение

       размером в длинное слово. Символическое имя и значение

       для каждого режима определяют при помощи  макрокоманды

       $JPIDEF:

       1) JPI$K_OTHER - 0;

       2) JPI$K_NETWORK - 1;




                           - 779 -

                        00152-01 97 06


       3) JPI$K_BATCH - 2;

       4) JPI$K_INTERACTIVE - 3;

  JPI$_MSGMASK -

       когда задан код JPI$_MSGMASK, $GETJPI возвращает маску

       принятых  по  умолчанию  сообщений  процесса,  которая

       представляет битовую маску размером в длинное слово;

  JPI$_OWNER -

       когда задан код JPI$_OWNER, $GETJPI возвращает иденти-

       фикатор процесса (PID), который создал указанный  про-

       цесс. PID - это шестнадцатиричное значение размером  в

       длинное слово;

  JPI$_PAGEFLTS -

       когда  задан  код  JPI$_PAGEFLTS,  $GETJPI  возвращает

       общее количество страничных отказов,  полученных  про-

       цессом. Это десятичное  значение  размером  в  длинное

       слово;

  JPI$_PAGFILCNT -

       когда задан  код  JPI$_PAGFILCNT,  $GETJPI  возвращает

       оставшуюся квоту файла обмена страниц процесса,  кото-

       рая представляет десятичное значение размером в  длин-

       ное слово;

  JPI$_PAGFILLOC -

       когда задан  код  JPI$_PAGFILLOC,  $GETJPI  возвращает

       адрес обмена страниц процесса; четвертый байт по  дан-

       ному адресу является  индексом  файла  обмена  страниц

       процесса;






                           - 780 -

                        00152-01 97 06


  JPI$_PGFLQUOTA -

       когда задан  код  JPI$_PGFLQUOTA,  $GETJPI  возвращает

       квоту файла обмена страниц процесса, которая представ-

       ляет десятичное значение размером в длинное слово;

  JPI$_PHDFLAGS -

       когда задан код JPI$_PHDFLAGS, $GETJPI возвращает фла-

       ги заголовка процесса,  которые  представляют  битовый

       вектор размером в длинное слово;

  JPI$_PID -

       когда задан код JPI$_PID, $GETJPI возвращает идентифи-

       катор процесса (PID). PID - это шестнадцатиричное зна-

       чение размером в длинное слово;

  JPI$_PPGCNT -

       когда задан код JPI$_PPGCNT, $GETJPI возвращает  коли-

       чество страниц в рабочем наборе. Это десятичное значе-

       ние размером в длинное слово;

  JPI$_PRCCNT -

       когда задан код JPI$_PRCCNT, $GETJPI  возвращает,  как

       десятичное значение размером в  длинное  слово,  коли-

       чество подпроцессов, созданных процессом.  Количество,

       возвращаемое по коду JPI$_PRCCNT, не включает  подпро-

       цессов, которые созданы подпроцессами процесса, задан-

       ного аргументом PROCNAM;

  JPI$_PRCLM -

       когда задан код JPI$_PRCLM, $GETJPI  возвращает  квоту

       подпроцессов процесса, которая представляет десятичное

       значение размером в длинное слово;




                           - 781 -

                        00152-01 97 06


  JPI$_PRCNAM -

       когда задан код JPI$_PRCNAM, $GETJPI  возвращает,  как

       символьную строку, имя процесса. Поскольку имя процес-

       са может включать до 15 символов, поле "длина  буфера"

       в дескрипторе элемента должна задавать 15 (байтов);

  JPI$_PRI -

       когда задан код JPI$_PRI, $GETJPI  возвращает  текущий

       приоритет процесса,  который  представляет  десятичное

       значение размером в длинное слово;

  JPI$_PRIB -

       когда задан код JPI$_PRIB, $GETJPI возвращает  базовый

       приоритет процесса,  который  представляет  десятичное

       значение размером в длинное слово;

  JPI$_PROC_INDEX -

       когда задан код JPI$_PROC_INDEX,  $GETJPI  возвращает,

       как десятичное  значение  размером  в  длинное  слово,

       индексный номер процесса. Индексный номер  процесса  -

       это число в диапазоне от 1 до значения параметра  сис-

       темной генерации MAXPROCESSCNT, которое идентифицирует

       данный процесс. Хотя на протяжении  времени  индексные

       номера  переназначаются  разным  процессам,  в   любой

       отдельный момент каждый процесс в системе  имеет  уни-

       кальный индексный номер. Пользователь может  использо-

       вать индексный номер процесса в качестве индекса  сис-

       темных глобальных секций. Так как индексный номер про-

       цесса является уникальным  для  каждого  процесса,  то

       использование его в качестве  индекса  системных  гло-




                           - 782 -

                        00152-01 97 06


       бальных секций гарантирует отсутствие  противоречий  с

       другими процессами системы, имеющими доступ  к  данным

       страницам;

  JPI$_PROCPRIV -

       когда задан код JPI$_PROCPRIV,  $GETJPI  возвращает  в

       битовую маску размером в  квадрослово  принимаемые  по

       умолчанию привилегии процесса;

  JPI$_SHRFILLM -

       когда задан код JPI$_SHRFILLM, $GETJPI возвращает мак-

       симальное количество открытых разделяемых файлов, раз-

       решенное для задания,  которому  принадлежит  процесс,

       указанный в вызове $GETJPI. Данный предел установлен в

       записи файла авторизации  того  пользователя,  который

       владеет процессом. Данное  количество  возвращается  в

       виде десятичного значения размером в слово. Значение 0

       означает, что для данного задания нет  ограничений  на

       количество открытых разделяемых файлов;

  JPI$_SITESPEC -

       когда задан код JPI$_SITESPEC, $GETJPI возвращает, как

       десятичное значение, длинное слово, учитывающее специ-

       фику вычислительной системы;

  JPI$_STATE -

       когда задан код JPI$_STATE, $GETJPI возвращает состоя-

       ние процесса, которое представляет десятичное значение

       размером в длинное слово. Каждое состояние имеет  сим-

       волическое представление.  Если  процесс  в  настоящий

       момент выполняется, то его состояние всегда SCH$K_CUR.




                           - 783 -

                        00152-01 97 06


       Макрокоманда $STATEDEF определяет следующие  обозначе-

       ния, идентифицирующие различные возможные состояния:

       1) SCH$C_CEF - ожидает установки общего флага события;

       2) SCH$C_COM - готов к вычислению;

       3) SCH$C_COMO - готов к вычислению, выгружен;

       4) SCH$C_CUR - текущий процесс;

       5) SCH$C_COLPG - ожидает занятую конкурентом страницу;

       6) SCH$C_FPG - ожидает свободную страницу;

       7) SCH$C_HIB - ожидает в спячке;

       8) SCH$C_HIBO - ожидает в спячке, выгружен;

       9) SCH$C_LEF - ожидает установки локального флага  со-

  бытия;

       10) SCH$C_LEFO - ожидает  установки  локального  флага

  события, выгружен;

       11) SCH$C_MWAIT - ожидает взаимоисключающий  и смешан-

  ный ресурс;

       12) SCH$C_PFW - ожидает страничный отказ;

       13) SCH$C_SUSP - приостановлен;

       14) SCH$C_SUSPO - приостановлен, выгружен;

  JPI$_STS -

       когда задан код  JPI$_STS,  $GETJPI  возвращает  флаги

       состояния процесса, которые содержатся в битовом  век-

       торе размером в длинное слово. Обозначения данных фла-

       гов, определяемые при помощи $PCBDEF следующие:

       1) PCB$V_ASTPEN - в ожидании AST;

       2) PCB$V_BATCH - процесс является пакетным заданием;

       3) PCB$V_DELPEN - в ожидании удаления;




                           - 784 -

                        00152-01 97 06


       4) PCB$V_DISAWS - запрещена автоматическая регулировка

  рабочего набора;

       5) PCB$V_FORCPEN - в ожидании принудительного выхода;

       6) PCB$V_ HIBER - спячка после выполнения образа;

       7) PCB$V_INQUAN - начальное квантование в развитии;

       8) PCB$V_INTER - процесс является интерактивным  зада-

  нием;

       9) PCB$V_LOGIN - подключение без чтения файла  автори-

  зации;

       10) PCB$V_NETWRK - процесс является об'ектом  соедине-

  ния сети;

       11) PCB$V_NOACNT - для процесса не ведется учет;

       12) PCB$V_NODELET - не удаляется;

       13) PCB$V_PHDRES - резидентный заголовок процесса;

       14) PCB$V_PSWAPM - режим обмена процесса (1 - не обме-

  нивается);

       15) PCB$V_PWRAST - AST по восстановлению питания;

       16) PCB$V_RECOVER - процесс может возвращать захваты;

       17) PCB$V_RES - резидентный, в балансном наборе;

       18) PCB$V_RESPEN  -  в  ожидании  возобновления  после

  приостановки;

       19) PCB$V_SSFEXC - разрешены  исключительные  ситуации

  по ошибке программ системного обслуживания (режим ядра);

       20) PCB$V_SSFEXCE - разрешены исключительные  ситуации

  по ошибке программ системного обслуживания (режим  управле-

  ния);

       21) PCB$V_SSFEXCS - разрешены исключительные  ситуации




                           - 785 -

                        00152-01 97 06


  по ошибке программ системного  обслуживания  (супервизорный

  режим);

       22) PCB$V_SSFEXCU - разрешены исключительные  ситуации

  по ошибке программ системного обслуживания  (пользовательс-

  кий режим);

       23) PCB$V_SSRWAIT -  запрещено  ожидание  ресурса  для

  системных программ системного обслуживания;

       24) PCB$V_SUSPEN - в ожидании приостановки;

       25) PCB$V_SWPVBN - запись для обмена VBN в развитии;

       26) PCB$V_WAKEPEN - в ожидании пробуждения после спяч-

  ки;

       27) PCB$V_WALL - ожидание всех событий в маске;

  JPI$_SWPFILLOC -

       когда задан  код  JPI$_SWPFILLOC,  $GETJPI  возвращает

       адрес  файла  обмена  процесса,  который  представляет

       шестнадцатиричное число размером в длинное слово. Чет-

       вертый байт данного значения идентифицирует файл обме-

       на; младшие три байта содержат номер виртуального бло-

       ка в файле обмена;

  JPI$_TABLENAME -

       когда задан  код  JPI$_TABLENAME,  $GETJPI  возвращает

       спецификацию файла для текущей таблицы  интерпретатора

       команд (CLI)  процесса.  Так  как  спецификация  файла

       может включать до 255 символов, поле "длина буфера"  в

       дескрипторе элемента должно задавать 255 (байтов);

  JPI$_TERMINAL -

       когда задан код JPI$_TERMINAL, $GETJPI возвращает  для




                           - 786 -

                        00152-01 97 06


       интерактивных пользователей,  как  символьную  строку,

       имя терминала подключения процесса. Так как имя терми-

       нала может включать до  7  символов,  то  поле  "длина

       буфера" в дескрипторе элемента должно задавать 7 (бай-

       тов);

  JPI$_TMBU -

       когда задан код JPI$_TMBU,  $GETJPI  возвращает  номер

       устройства почтового ящика завершения, который  предс-

       тавляет десятичное значение размером в длинное слово;

  JPI$_TQCNT -

       когда задан код JPI$_TQCNT, $GETJPI возвращает  остав-

       шуюся для процесса квоту элементов очереди к  таймеру,

       которая представляет десятичное  значение  размером  в

       длинное слово;

  JPI$_TQLM -

       когда задан код JPI$_TQLM, $GETJPI возвращает лимит на

       количество элементов  к  очереди  к  таймеру,  которое

       представляет десятичное значение  размером  в  длинное

       слово;

  JPI$_UAF_FLAGS -

       когда задан  код  JPI$_UAF_FLAGS,  $GETJPI  возвращает

       флаги файла авторизации пользователя (UAF)  из  записи

       того пользователя, который  владеет  процессом.  Флаги

       возвращаются в виде битового вектора размером в  длин-

       Ное слово;

  JPI$_UIC -

       когда задан код JPI$_UIC, $GETJPI возвращает код иден-




                           - 787 -

                        00152-01 97 06


       тификатора пользователя (UIC) процесса  в  стандартном

       формате размером в длинное слово;

  JPI$_USERNAME -

       когда задан код JPI$_USERNAME, $GETJPI возвращает  имя

       пользователя данного процесса в виде 12-байтовой стро-

       ки. Если данное  имя  короче  12  байтов,  то  $GETJPI

       дополняет его справа пробелами до 12 байтов;

  JPI$_VIRTPEAK -

       когда задан код JPI$_VIRTPEAK, $GETJPI возвращает мак-

       симальный достигнутый размер виртуальных адресов  про-

       цесса в виде десятичного значения размером  в  длинное

       слово;

  JPI$_VOLUMES -

       когда задан код JPI$_VOLUMES, $GETJPI возвращает коли-

       чество томов, смонтированных  процессом  к  настоящему

       моменту, в виде десятичного значения размером в  длин-

       ное слово;

  JPI$_WSAUTHEXT -

       когда задан  код  JPI$_WSAUTHEXT,  $GETJPI  возвращает

       максимальны авторизованный размер рабочего набора про-

       цесса в виде десятичного значения размером  в  длинное

       слово;

  JPI$_WSEXTENT -

       когда  задан  код  JPI$_WSEXTENT,  $GETJPI  возвращает

       текущее расширение рабочего  набора  процесса  в  виде

       десятичного значения размером в длинное слово;






                           - 788 -

                        00152-01 97 06


  JPI$_WSPEAK -

       когда задан код JPI$_WSPEAK, $GETJPI возвращает макси-

       мальный достигнутый размер рабочего набора процесса  в

       виде десятичного значения размером в длинное слово;

  JPI$_WSQUOTA -

       когда задан код JPI$_WSQUOTA, $GETJPI возвращает квоту

       рабочего набора процесса в виде  десятичного  значения

       размером в длинное слово;

  JPI$_WSSIZE -

       когда задан код JPI$_WSSIZE, $GETJPI возвращает  теку-

       щий размер рабочего набора процесса в виде десятичного

       значения размером в длинное слово.

       IOSB

       Использование в МОС ВП: IO_STATUS_BLOCK

       Тип:                    квадрослово (без знака)

       Доступ:                 только запись

       Механизм:               по ссылке

       Блок состояния ввода-вывода, который  должен  получить

  окончательный код завершения. Аргумент  IOSB  -  это  адрес

  блока состояния ввода-вывода, занимающего квадрослово.

       Если задан аргумнт IOSB, то $GETJPI  перед  инициацией

  запроса сбрасывает в нуль это квадрослово. После выполнения

  запроса в первое длинное слово  передается  код  состояния;

  второе длинное  слово  резервируется  для  использования  в

  дальнейшем.








                           - 789 -

                        00152-01 97 06


       Хотя данный аргумент является необязательным, рекомен-

  дуется указывать его по следующим причинам:

                - если для сигнализации о завершении програм-

                  мы  системного  обслуживания   используется

                  флаг события, то можно проверить  код  сос-

                  тояния в блоке состояния ввода-вывода, что-

                  бы убедиться, что данный  флаг  события  не

                  был установлен событием, отличным от завер-

                  шения программы системного обслуживания;

                - если для синхронизации завершения программы

                  системного обслуживания используется  прог-

                  рамма системного  обслуживания  $SYNCH,  то

                  блок состяния ввода-вывода является  обяза-

                  тельным аргументом для $SYNCH;

                - код состояния, возвращаемый в регситре  R0,

                  и код состояния, возвращаемый в  блок  сос-

                  тояния ввода-вывода, обеспечивает  информа-

                  цию о разных аспектах вызова программы сис-

                  темного обслуживания $GETJPI.  Код  состоя-

                  ния, возвращаемый в R0, дает  информацию  о

                  том, успешно или нет осуществлен сам  вызов

                  программы системного обслуживания; код сос-

                  тояния,  возвращаемый  в   блок   состояния

                  ввода-вывода, дает информаицю о  том,  нас-

                  колько успешно отработала программа систем-

                  ного  обслуживания.  Следовательно,   чтобы

                  более  точно  оценить   успешность   вызова




                           - 790 -

                        00152-01 97 06


                  $GETJPI, необходимо проверять коды  состоя-

                  ния, возвращаемые как в R0, так  и  в  блок

                  состояния ввода-вывода (см. подраздел 2.5).

       ASTADR

       Использование в МОС ВП: AST_PROCEDURE

       Тип:                    маска входа программы

       Доступ:                 вызов без развертывания стека

       Механизм:               по ссылке

       Подпрограмма обработки AST, которая должна выполняться

  по завершении $GETJPI. Аргумент ASTADR -  это  адрес  маски

  входа данной подпрограммы.

       Если задан аргумент ASTADR, то подпрограмма AST  будет

  выполняться в том же режиме доступа, что и процесс, вызвав-

  ший программу системного обслуживания $GETJPI.

       ASTPRM

       Использование в МОС ВП: USER_ARG

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Параметр AST, который необходимо передать подпрограмме

  обработки AST, заданной аргументом ASTADR. Аргумент  ASTPRM

  - это параметр размером в длинное слово.

       Описание

       Получение информации о другом процессе является асинх-

  ронной операцией, поскольку информация может содержаться  в

  виртуальном адресном пространстве другого процесса, а  дан-

  ный процесс может иметь меньший приоритет  или  может  быть




                           - 791 -

                        00152-01 97 06


  выгружен из балансного набора. Чтобы дать возможность вызы-

  вающей программе выполнить  другие  функции  за  то  время,

  которое потребуется на то, чтобы  запланировать  выполнение

  другого процесса или чтобы загрузить его в балансный набор,

  программа $GETJPI возвращает управление сразу  после  того,

  как она поставила в очередь запрос  на  сбор  информации  о

  другом процессе.

       Задавать процесс программе $GETJPI  лучше  при  помощи

  аргумента PIDADR вместо аргумента PRCNAM по следующим  при-

  чинам:

       1) аргумент PIDADR можно использовать для  идентифика-

  ции любого процесса в системе, тогда  как  аргумент  PRCNAM

  можно использовать только для идентификации тех  процессов,

  которые имеют тот же номер группы UIC, что и процесс, вызы-

  вающий $GETJPI;

       2) если использовать аргумент PIDADR вместо PRCNAM, то

  $GETJPI выполняется быстрее. Когда задан  аргумент  PRCNAM,

  программа $GETJPI должна искать в таблице имен процессов  и

  кодов идентификации  пользователя  (UIC)  элемент,  который

  содержит заданное имя процесса и номер группы UIC  вызываю-

  щего процесса; данный поиск  не  нужен,  если  используется

  аргумент PIDADR.

       Что касается привилегий, то вызывающий процесс  должен

  иметь привилегию GROUP для того, чтобы получить  информацию

  о любом процессе (кроме самого себя) в данной группе. Чтобы

  получить информацию о процессе с другим номером группы UIC,

  вызывающий процесс должен иметь привилегию WORLD (и  должен




                           - 792 -

                        00152-01 97 06


  использовать аргумент PIDADR вместо PRCNAM).

       В табл.60 показано, как программа $GETJPI обрабатывает

  различные значения, заданные для аргуменов PRCNAM и PIDADR.


                                                   Таблица 60

  -----------------------------------------------------------

  Имя про-!Иденти- !Иденти- !

  цесса   !фикатор !фикатор !      Действия

  указано?!процесса!процесса!      программы

          !указан? !содержит!

  -----------------------------------------------------------

  Нет     !Нет     !-       !Используется идентификатор вызы-

          !        !        !вающего процесса, и идентифика-

          !        !        !тор процесса не возвращается

  Нет     !Да      !0       !Используется и возвращается

          !        !        !идентификатор вызывающего проце-

          !        !        !сса

  Нет     !Да      !Иденти- !Используется и возвращается дан-

          !        !фикатор !ный идентификатор процесса

          !        !процесса!

  Да      !Нет     !-       !Используется имя процесса, иде-

          !        !        !нтификатор процесса не возвраща-

          !        !        !ется

  Да      !Да      !0       !Используется имя процесса и

          !        !        !возвращается идентификатор про-

          !        !        !цесса

  Да      !Да      !Иденти- !Используется и возвращается




                           - 793 -

                        00152-01 97 06


                                         Продолжение табл. 60

  -----------------------------------------------------------

  Имя про-!Иденти- !Иденти- !

  цесса   !фикатор !фикатор !      Действия

  указано?!процесса!процесса!      программы

          !указан? !содержит!

  -----------------------------------------------------------

          !        !фикатор !идентификатор процесса; имя

          !        !процесса!процесса игнорируется


  возвращаемые значения кода состояния:

       SS$_NORMAL          - успешное завершение;

       SS$_BADPARAM        - список элементов содержит невер-

                           ный идентификатор;

       SS$_ACCVIO          - вызывающий процесс не может про-

                           читать  список  элементов  или  не

                           может записать в буфер  или  длину

                           буфера;

       SS$_IVLOGNAM        - строка  имени   процесса   имеет

                           нулевую длину или длину  более  15

                           символов;

       SS$_NOMOREPROC      - предупреждение.  $GETJPI  больше

                           не находит процессов;

       SS$_NONEXPR         - предупреждение.  Указанный  про-

                           цесс  не  существует,  либо  задан

                           неверный идентификатор процесса;

       SS$_NOPRIV          - процесс не имеет  привилегии  на

                           получение информации об  указанном



                           - 794 -

                        00152-01 97 06


                           процессе;

       SS$_SUSPENDED       - заданный  процесс  приостановлен

                           или находится в состоянии ожидания

                           смешанного ресурса, и  запрошенную

                           информацию нельзя получить.

       - коды  состояния,  возвращаемые  в   блок   состояния

  ввода-вывода такие же, как те, что возвращаются в  регистре

  R0.



       13.59. $GETJPIW  -   получить   информацию   о

              задании или процессе и ждать


       Программа системного обслуживания $GETJPIW  возвращает

  информацию об одном или нескольких процессах в системе.

       Программа $GETJPIW завершается сихронно; то  есть  она

  возвращает управление вызывающему процессу вместе с  запро-

  шенной информацией.

       Для асинхронного  выполнения  необходимо  использовать

  программу системного обслуживания  "получить  информацию  о

  задании или процессе" ($GETJPI); $GETJPI возвращает  управ-

  ление вызывающему процессу после постановки в очередь  зап-

  роса на  получение  информации,  не  ожидая,  когда  данная

  информация будет возвращена.

       Во всех других аспектах  $GETJPIW  идентична  $GETJPI.

  Вся остальная информация о программе системного  обслужива-

  ния $GETJPIW содержится в описании $GETJPI  (см.  Подраздел

  2.5).





                           - 795 -

                        00152-01 97 06


       Формат:

       SYS$GETJPIW     [EFN],[PIDADR],[PRCNAM],

                       ITMLST,[IOSB],[ASTADR],[ASTPRM]



       13.60. $GETLKI - получить информацию о захвате


       Программа системного обслуживания  $GETLKI  возвращает

  информацию о базе данных захвата операционной  системы  МОС

  ВП.

       Программа системного обслуживания $GETLKI  завершается

  асинхронно; то есть, она возвращает управление  вызывающему

  процессу после постановки в очередь запроса на  информацию,

  не ожидая, когда информация будет возвращена.

       Для  синхронного  завершения  необходимо  использовать

  программу системного обслуживания  "получить  информацию  о

  захвате и ждать" ($GETLKIW); $GETLKIW возвращает управление

  вызывающему процессу с  запрошенной  информацией.  Во  всех

  других аспектах $GETLKIW идентична $GETLKI  (см.  подраздел

  2.5).

       Программы системного обслуживания  $GETLKI,  $GETLKIW,

  $ENQ (поставить в очередь запрос на захват), $ENQW  (поста-

  вить в очередь запрос на захват и ждать) и $DEQ (удалить из

  очереди запрос на захват) в совокупности обеспечивают поль-

  зователю интерфейс со средством управления захватом МОС ВП.

  Дополнительная информация об управлении захватом содержится

  в описании остальных из данных программ системного обслужи-

  вания.





                           - 796 -

                        00152-01 97 06


       Формат:

       SYS$GETLKI     [EFN],[LKIDADR],ITMLST,[IOSB],

                      [ASTADR],[ASTPRM],[NULLARG]

       Аргументы:

       EFN

       Использование в МОС ВП: EF_NUMBER

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Номер флага события,  который  необходимо  установить,

  когда завершится $GETLKI. Аргумент EFN - это длинное слово,

  содержащее данный номер. Если  EFN  не  задан,  то  $GETLKI

  устанавливает флаг событий 0.

       LKIDADR

       Использование в МОС ВП: LOCK_ID

       Тип:                    длинное слово (без знака)

       Доступ:                 модификация

       Механизм:               по ссылке

       Идентификатор захвата (LOCK ID), информацию о  котором

  требуется вернуть. Идентификатор захвата - это второе длин-

  ное слово в блоке состояния, который создается при удовлет-

  ворении запроса на захват. Аргумент LKIDADR является  адре-

  сом данного длинного слова.

       Если значение, задаваемое аргументом LKIDADR, равно  0

  или минус 1, то $GETLKI возвращает информацию о каждом зах-

  вате, к которому вызывающий процесс имеет доступ, по одному

  захвату на вызов.




                           - 797 -

                        00152-01 97 06


       Программа системного обслуживания $GETLKI должна иметь

  доступ на чтение/запись данного идентификатора захвата.

       ITMLST

       Использование в МОС ВП: ITEM_LIST_3

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по ссылке

       Список элементов,  определяющих,  какую  информацию  о

  захвате должна вернуть $GETLKI. Аргумент ITMLST - это адрес

  списка дескрипторов, каждый из которых описывает  отдельный

  элемент информации. Список дескрипторов элементов  заканчи-

  вается длинным словом,  содержащим  0.  Формат  дескриптора

  элемента приведен на рис.66.



                     Дескриптор элемента

       ------------------------------------------------------
       !      Код элемента       !      Длина буфера        !
       ------------------------------------------------------
       !                Адрес буфера                        !
       ------------------------------------------------------
       !       Адрес длины возвращаемой информации          !
       ------------------------------------------------------

                        Рис. 66


       Поля дескриптора элемента $GETLKI следующие:

  длина буфера -

       слово, содержащее заданное пользователем целое  значе-

       ние, которое указывает длину (в байтах) буфера,  пред-

       назначенного для записи информации программой $GETLKI.

       требуемая длина буфера зависит от кода  эемента,  ука-

       занного в поле "код  элемента"  дескриптора  элемента.



                           - 798 -

                        00152-01 97 06


       Если значение длины буфера слишком мало, $GETLKI возв-

       ращает  усеченные  данные  и  успешный  код   возврата

       SS$_NORMAL;

  код элемента -

       слово, содержащее заданный пользователем символический

       код, определяющий элемент информации,  который  должна

       вернуть программа $GETLKI.  Данные  коды  определяются

       макрокомандой $LKIDEF;

  адрес буфера -

       длинное слово, содержащее заданный пользователем адрес

       буфера, в который $GETLKI должна писать информацию;

  адрес длины возвращаемой информации -

       длинное слово, содержащее заданный пользоваталем адрес

       слова, в которое $GETLKI записывает длину возвращаемой

       информации. Данное длинное слово содержит три  битовых

       поля:

       биты с 0 по 15 - в данное поле $GETLKI записывает дли-

  ну (в байтах) данных, фактически записанных в буфер, задан-

  ный полем "адрес буфера" в дескрипторе элемента;

       биты с 16 по 30 - $GETLKI использует данное поле толь-

  ко в тех случаях, когда поле "код элемента"  в  дескрипторе

  элемента  содержит  код  LKI$BLOCKEDBY,  LKI$BLOCKING   или

  LKI$LOCKS, каждый из которых запрашивает информацию о спис-

  ке захватов. $GETLKI записывает в данное поле длину (в бай-

  тах) информации, возвращаемой для одного захвата из списка.

  Смысл заключается в том, что пользователь  может  разделить

  на данную величину общую длину, возвращаемую для всех  зах-




                           - 799 -

                        00152-01 97 06


  ватов (биты с 0 по 15), чтобы определить количество  захва-

  тов, найденных по запросу данного кода элемента;

       бит 31 - $GETLKI устанавливает данный бит, если задан-

  ный пользователем аргумент  "длина  буфера"  задает  размер

  буфера, недостаточный для получения запрошенной информации.

  В таком случае $GETLKI будет возвращать в регистре  R0  код

  состояния SS$_NORMAL. Следовательно, чтобы обнаружить ошиб-

  ки в дескрипторе элемента, необходимо  проверять  состояние

  бита 31 в длинном слове, заданном в поле "длина  возвращае-

  мой информации" каждого дескриптора элемента.

       Коды элементов $GETLKI:

  LKI$_BLOCKEDBY -

       когда задан  код  LKI$_BLOCKEDBY,  $GETLKI  возвращает

       информацию о всех захватах, которые на текущий  момент

       заблокированы захватом, заданным заблокированном  зах-

       вате.

       К данным элементам в буфере можно обращаться при помо-

  щи следующих символических имен, которые определяют  макро-

  командой $LKIDEF:

       1) LKI$L_LOCKID - идентификатор заблокированного  зах-

  вата в системе, которая поддреживает данный ресурс (4  бай-

  та);

       2) LKI$L_PID - идентификатор процесса  (PID),  который

  получал данный заблокированный захват (4 байта);

       3) LKI$B_RQMODE - режим захвата, запрошенный для  бло-

  кирующего захвата; данный режим захвата задается аргументом

  LKMODE в вызове $ENQ (1 байт);




                           - 800 -

                        00152-01 97 06


       4) LKI$B_GRMODE - режим захвата, предоставленный  бло-

  кирующему захвату; данный режим захвата записывается в блок

  захвата (1 байт);

       5) LKI$B_QUEUE - имя очереди,  в  которой  на  текущий

  момент находится заблокированный захват (1 байт). Значения,

  которые $GETLKI может  записать  в  элементы  LKI$B_RQMODE,

  LKI$B_GRMODE и LKI$B_QUEUE, имеют символические имена; дан-

  ные символические имена определяют шесть режимов захвата  и

  три типа очередей, в которых может находиться захват.

       Таким образом, буфер, заданный при помощи поля  "адрес

  буфера" в дескрипторе элемента,  будет  содержать  элементы

  информации, повторенные последовательно для каждого  забло-

  кированного захвата.

       Длина информации, возвращаемой для каждого  заблокиро-

  ванного захвата, записывается в биты с 16  по  30  длинного

  слова, заданного при помощи поля "адрес длины  возвращаемой

  информации", в дескрипторе элемента, тогда как общая  длина

  информации, возвращаемой для свех заблокированных захватов,

  записывается в биты с 0 по 15. Следовательно, чтобы опреде-

  лить количество заблокированных захватов, необходимо разде-

  лить значение, содержащееся в битах с 0 по 15, на значение,

  содержащееся в битах с 16 по 30;

  LKI$_BLOCKING -

       когда  задан  код  LKI$_BLOCKING,  $GETLKI  возвращает

       информацию о всех захватах, которые в  текущий  момент

       блокируют захват, заданный аргументом  LKIDADR.  Прог-

       рамма возвращает ряд  элементов  информации  о  каждом




                           - 801 -

                        00152-01 97 06


       блокирующем захвате.

       К элементам в буфере можно обращаться при помощи  сле-

  дующих имен, которые определяет макрокоманда $LKIDEF:

       1) LKI$L_LOCKID - идентификатор блокирующего захвата в

  системе, которая поддерживает данный ресурс (4 байта);

       2) LKI$L_PID - идентификатор процесса  (PID),  который

  получал данный блокирующий захват (4 байта;

       3) LKI$B_RQMODE - режим захвата, запрошенный для  бло-

  кирующего захвата; данный режим захвата задается аргументом

  LKMODE в вызове $ENQ (1 байт);

       4) LKI$B_GRMODE - режим захвата, предоставленный  бло-

  кирующему захвату; данный режим захвата записывается в блок

  захвата (1 байт);

       5) LKI$B_QUEUE - имя очереди,  в  которой  на  текущий

  момент находится блокирующий захват (1 байт).

       Значения, которые $GETLKI может  записать  в  элементы

  LKI$B_RQMODE, LKI$B_GRMODE и LKI$B_QUEUE, имеют символичес-

  кие имена;  данные  символические  имена  определяют  шесть

  режимов захвата и три типа очередей, в которых может  нахо-

  диться захват.

       Буфер, заданный при помощи поля "адрес буфера" в деск-

  рипторе элемента, будет содержать указанные элементы инфор-

  мации, повторенные последовательно для каждого блокирующего

  захвата.

       Длина информации, возвращаемой для каждого блокирующе-

  го захвата, записывается в биты с 16 по 30 длинного  слова,

  заданного при помощи поля "адрес длины возвращаемой  инфор-




                           - 802 -

                        00152-01 97 06


  мации", возвращаемой для всех блокирующих захватов, а общая

  длина всей информации, возвращаемой  для  всех  блокирующих

  захватов, записывается в биты с  0  по  15.  Следовательно,

  чтобы определить количество блокирующих захватов, необходи-

  мо разделить значение, содержащееся в битах с 0 по  15,  на

  значение, содержащееся в битах с 16 по 30;

  LKI$_LCKCOUNT -

       когда  задан  код  LKI$_LCKCOUNT,  $GETLKI  возвращает

       общее количество предоставленных захватов  на  ресурс,

       связанный с текущим захватом. Поле  "длина  буфера"  в

       дескрипторе элемента должно содержать 4 (байта);

  LKI$_LCKREFCNT -

       когда задан  код  LKI$_LCKREFCNT,  $GETLKI  возвращает

       количество захватов, для  которых  данный  захват  был

       порождающим. Когда данные захваты  создавались,  аргу-

       мент PARID в вызове $ENQ или $ENQW задавал идентифика-

       тор данного захвата;

  LKI$_LOCKID -

       когда задан код LKI$_LOCKID, $GETLKI возвращает  иден-

       тификатор текущего захвата. Текущий  захват  -  данный

       захват,  заданный  аргументом  LKIDADR,  если   только

       LKIDADR не задан как минус 1 или 0. Идентификатор зах-

       вата - это значение размером в длинное слово,  поэтому

       поле "длина  буфера"  в  дескрипторе  элемента  должно

       содержать 4 (байта);

  LKI$_LOCKS -

       когда задан код LKI$_LOCKS, $GETLKI возвращает  инфор-




                           - 803 -

                        00152-01 97 06


       мацию о всех захватах на ресурс, связанный с захватом,

       который  задан  аргументом  LKIDADR.  Данные   захваты

       представляют сумму блокирующих и заблокированных  зах-

       ватов. К элементам в буфере можно обращаться при помо-

       щи следующих символических имен, которые  определяются

       макрокомандой $LKIDEF:

       1) LKI$L_LOCKID -  идентификатор  захвата  в  системе,

  которая поддреживает данный ресурс (4 байта);

       2) LKI$L_PID - идентификатор процесса  (PID),  который

  получал данный захват (4 байта);

       3) LKI$B_RQMODE - режим захвата, запрошенный для  дан-

  ного захвата; данный  режим  захвата  был  задан  аргуменом

  LKMODE в вызове $ENQ (1 байт);

       4) LKI$B_GRMODE - режим, предоставелнный данному  зах-

  вату; данный режим захвата записан в блоке значений захвата

  (1 байт);

       5) LKI$B_QUEUE - имя очереди,  в  которой  на  текущий

  момент находится данный захват (1 байт).

       Значения, которые $GETLKI может  записать  в  элементы

  LKI$B_RQMODE, LKI$B_GRMODE и LKI$B_QUEUE, имеют символичес-

  кие имена;  данные  символические  имена  определяют  шесть

  режимов захвата и три типа очередей, в которых может  нахо-

  диться захват.

       Буфер, заданный при помощи поля "адрес буфера" в деск-

  рипторе элемента, будет  содержать  перечисленные  элементы

  информации, повторенные последовательно для каждого  захва-

  та.




                           - 804 -

                        00152-01 97 06


       Длина информации,  возвращаемой  для  каждого  захвата

  записывается в биты с 16 по 30  длинного  слова,  заданного

  при помощи поля "адрес  длины  возвращаемой  информации"  в

  дескрипторе элемента, тогда  как  общая  длина  информации,

  возвращаемой для всех захватов, записывается в биты с 0  по

  15. Следовательно, чтобы  определить  количество  захватов,

  необходимо разделить значение, содержащееся в битах с 0  по

  15, на значение, содержащееся в битах с 16 по 30;

  LKI$_NAMSPACE -

       когда  задан  код  LKI$_NAMSPACE,  $GETLKI  возвращает

       информацию об атрибутах имени ресурса. Данная информа-

       ция содержится в длинном слове, состоящем  из  четырех

       битовых полей; слеовательно,  поле  "длина  буфера"  в

       дескрипторе элемента должно содержать 4 (байта).

       К каждому из четырех битовых полей можно обращаться по

  его символическому имени; данные символические имена  опре-

  деляют макрокомандой $LKIDEF:

       1) LKI$W_GROUP - в  данное  поле  (биты  с  0  по  15)

  $GETLKI записывает номер группы UIC того процесса,  который

  первым получил захват ресурса, создав тем самым имя  ресур-

  са. Данный процесс вызвал $ENQ или $ENQW, задав в аргументе

  RESNAM имя данного ресурса.  Однако,  если  данный  процесс

  указал флаг LCK$_SYSTEM, в вызове $ENQ или  $ENQW,  то  имя

  ресурса является общесистемным. В таком случае номер группы

  UIC процесса не связан с именем ресурса. Если  имя  ресурса

  является общесистемным, то $GETLKI устанавливает бит 31;

       2) LKI$W_RMOD - в  данное  поле  (биты  с  16  по  23)




                           - 805 -

                        00152-01 97 06


  $GETLKI записывает режим доступа, связанный с первым  полу-

  ченным захватом на ресурс;

       3) LKI$W_STATUS - данное поле (биты с  24  по  30)  не

  используются. $GETLKI устанавливает его в 0;

       4) LKI$W_SYSNAM - данное  поле  (бит  31)  показывает,

  является ли имя ресурса общесистемным.  $GETLKI  устанавли-

  вает данный бит, если имя ресурса  является  общесистемным,

  сбрасывает его, если имя  ресурса  квалифицировано  номером

  группы UIC  создающего  процесса.  Состояние  данного  бита

  определяет интерпретацию битов с 0 по 15;

  LKI$_PARENT -

       когда задан код LKI$_PARENT, $GETLKI возвращает  иден-

       тификатор захвата, порождающего данный захват, если  в

       вызове $ENQ или $ENQW  был  порождающий  захват.  Если

       данный  захват  не  имеет  порождающего  захвата,   то

       $GETLKI возвращает значение 0. Поскольку идентификатор

       порождающего захвата имеет размер длинного  слова,  то

       поле "длина  буфера"  в  дескрипторе  элемента  должно

       задавать 4 (байта);

  LKI$_PID -

       когда задан код LKI$_PID, $GETLKI возвращает идентифи-

       катор того процесса, который владеет данным  захватом.

       Идентификатор процесса - данное  значение  размером  в

       длинное слово, поэтому поле "длина буфера" в  дескрип-

       торе элемента должно содержать 4 (байта);

  LKI$_RESNAM -

       когда задан код LKI$_RESNAM, $GETLKI возвращает строку




                           - 806 -

                        00152-01 97 06


       имени ресурса и ее длину, от 1  до  31  байта.  Данная

       строка имени ресурса была задана  в  аргументе  RESNAM

       при первоначальном  вызове  $ENQ  или  $ENQW.  $GETLKI

       возвращает длину строки в поле "адрес длины возвращае-

       мой информации" в  дескрипторе  элемента.  Однако  при

       вызове $GETLKI  пользователь  не  знает,  какой  длины

       будет данная строка.  Следовательно,  чтобы  исключить

       переполнение буфера, необходимо задавать в поле "длина

       буфера" в дескрипторе элемента максимальную длину  (31

       байт);

  LKI$_RSBREFCNT -

       когда задан  код  LKI$_RSBREFCNT,  $GETLKI  возвращает

       количество подресурсов того ресурса, который связан  с

       данным захватом. Количество  подресурсов  может  отли-

       чаться от количества подзахватов данного захвата.  Так

       получается потому, что ресурс могут захватить несколь-

       ко процессов. Если какие-то из данных процессов  потом

       захватывают другой ресурс и при этом указывают иденти-

       фикатор захвата на первый ресурс в качестве  порождаю-

       щего, то второй ресурс становится подресурсом  первого

       ресурса.

       Таким образом, количество подзахватов для одного  зах-

  вата  ограничивается  количеством  подзахватов,  полученных

  одним процессом; тогда как количество подресурсов для одно-

  го ресурса определяется (потенциально) несколькими  процес-

  сами.

       Счетчик обращений к подресурсу - это значение размером




                           - 807 -

                        00152-01 97 06


  в длинное слово, поэтому поле "длина буфера" в  дескрипторе

  элемента должно содержать 4 (байта);

  LKI$_STATE -

       когда задан код LKI$_STATE, $GETLKI возвращает текущее

       состояние захвата. Текущее  состояние  захвата  описы-

       вается следующими тремя однобайтовыми элементами (ука-

       занными по порядку):

       1) запрошенный режим захвата (в вызове $ENQ или ENQW);

       2) предоставленный режим захвата (программой $ENQ  или

  $ENQW);

       3) имя очереди, в которой на текущий момент  находится

  данный захват.

       Поле "длина  буфера"  в  дескрипторе  элемента  должно

  содержать 3 (байта). К трем однобайтовым элементам в буфере

  можно обращаться при помощи следующих  символических  имен,

  которые определяет макрокоманда $LKIDEF:

       1) LKI$B_STATE_RQMODE - запрошенный режим захвата;

       2) LKI$B_STATE_GRMODE - предоставленный режим захвата;

       3) LKI$B_STATE_QUEUE - имя очереди, в которой находит-

  ся захват.

       Значения, которые $GETLKI может  записывать  в  каждый

  однобайтовый элемент,  имеют  символические  имена;  данные

  символические имена определяют шесть режимов захвата и  три

  типа очередей, в которых может находиться захват;

  LKI$_VALBLK -

       когда задан код LKI$_VALBLK, $GETLKI  возвращает  блок

       значений захвата для захваченного ресурса. Данный блок




                           - 808 -

                        00152-01 97 06


       значений  захвата  является  копией  основного  блока,

       который планировщик захватов поддреживает для  данного

       ресурса, а не копией личного блока процесса.  Так  как

       блок значений захвата  занимает  16  байтов,  то  поле

       "длина буфера" в дескрипторе элемента должно содержать

       16.

       IOSB

       Использование в МОС ВП: IO_STATUS_BLOCK

       Тип:                    квадрослово (без знака)

       Доступ:                 только запись

       Механизм:               по ссылке

       Блок состояния ввода-вывода, который  должен  получить

  окончательный код завершения. Аргумент  IOSB  -  это  адрес

  квадрослова.

       Программа $GETLKI при вызове ее сбрасывает  в  0  блок

  состония ввода-вывода. Когда $GETLKI завершается, она запи-

  сывает в первое длинное слово данного квадрослова код  сос-

  тояния. Оставшиеся два слова в квадрослове не используются.

       Хотя  данный  аргумент  является  необязательным,  его

  рекомендуется задавать по следующим причинам:

       1) если для сигнализации о завершении  программы  сис-

  темного обслуживания используется флаг состояния, то  можно

  проверить код состояния в блоке  ввода-вывода,  чтобы  убе-

  диться в том, что данный флаг  события  не  был  установлен

  событием, отличным от завершения программы системного  обс-

  луживания;

       2) если для синхронизации завершения программы систем-




                           - 809 -

                        00152-01 97 06


  ного обслуживания используется программа системного  обслу-

  живания $SYNCH, то блок состония ввода-вывода является обя-

  зательным аргументом для $SYNCH;

       3) код состояния, возвращаемый в регистре  R0,  и  код

  состояния,  возвращаемый  в  блок  состояния  ввода-вывода,

  обеспечивают информацию о разных аспектах вызова  программы

  системного обслуживания $GETLKI. Код состояния,  возвращае-

  мый в R0, дает информацию о том, успешно или нет  осуществ-

  лен сам вызов программы системного обслуживания;  код  сос-

  тояния, возвращаемый в блок  состояния  ввода-вывода,  дает

  информацию о том, насколько  успешно  отработала  программа

  системного обслуживания.  Следовательно,  для  того,  чтобы

  точно оценить успешность вызова $GETLKI, необходимо  прове-

  рять коды состояния, возвращаемые как в R0, так  и  в  блок

  состояния ввода-вывода.

       ASTADR

       Использование в МОС ВП: AST_PROCEDURE

       Тип:                    маска входа программы

       Доступ:                 вызов без развертывания стека

       Механизм:               по ссылке

       Подпрограмма обработки AST, которая должна выполняться

  по завершении $GETLKI. Аргумент ASTADR -  это  адрес  маски

  входа данной подпрограммы.

       Если задан аргумент ASTADR, то подпрограмма AST  будет

  выполняться в том режиме доступа, что и процесс,  вызвавший

  программу системного обслуживания $GETLKI.






                           - 810 -

                        00152-01 97 06


       ASTPRM

       Использование в МОС ВП: USER_ARG

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Параметр AST, который необходимо передать подпрограмме

  обработки AST, заданной ASTADR. Аргумент ASTPRM - это пара-

  метр размером в длинное слово.

       NULLARG

       Использование в МОС ВП: NULL_ARG

       Тип:                    длинное слово (без знака)

       Доступ:                 только чтение

       Механизм:               по значению

       Аргумент, занимающий место.

       Описание

       В зависимости  от  конкретной  операции  использование

  программы $GETLKI может потребовать наличия  у  вызывающего

  процесса определнных привилегий:

       1) привилегия WORLD необходима для получения  информа-

  ции о захватах, принадлежащих процессам из других групп;

       2) для получения информации о системных захватах необ-

  ходимо, чтобы процесс либо  имел  привилегию  SYSLCK,  либо

  выполнялся в режиме управления или в режиме ядра.

       Режим доступа вызывающего процесса должен быть  равным

  или более привилегированным по сравнению с режимом доступа,

  которому первоначально был предоставлен данный захват.

       Если   заданы   коды   LKI$_BLOKEDBY,   LKI$_BLOCKING,




                           - 811 -

                        00152-01 97 06


  LKI$_LOCKS и LKI$_STATE, то  $GETLKI  возвращает  различные

  элементы информации; некоторые из данных  элементов  предс-

  тавляют названия режимов захвата или названия очередей зах-

  вата. Названия имеют символические имена, определяемые  при

  помощи макрокоманды $LKIDEF.

       Имеются следующие символические имена:

       1) LCK$K_NLMODE - нулевой режим;

       2) LCK$K_CRMODE - режим совместного чтения;

       3) LCK$K_CWMODE - режим совместной записи;

       4) LCK$K_PRMODE - режим защищенного чтения;

       5) LCK$K_PWMODE - режим защищенной записи;

       6) LCK$K_EXMODE - монопольный режим;

       7) LKI$C_GRANTED - предоставленная очередь, содержащая

  захваты, которые уже предоставлены;

       8) LKI$C_CONVERT - очередь преобразований,  содержащая

  захваты, которые на текущий момент  нужно  преобразовать  в

  другой режим захвата;

       9) LKI$C_WAITING - очередь ожиданий, содержащая захва-

  ты, которые еще не предоставлены или не преобразованы (нап-

  ример, заблокированные захваты).

       Возвращаемые значения кода состояния:

       SS$_NORMAL     - успешное завершение;

       SS$_NOMORELOCK - вызывающий процесс указал  для  аргу-

                      мента LKIDADR значение 0 или минус 1, и

                      программа  $GETLKI  исчерпала  захваты,

                      информацию о которых она должна вернуть

                      вызывающему процессу. Это  альтернатив-




                           - 812 -

                        00152-01 97 06


                      ный код успешного завершения;

       SS$_ACCVIO     - нельзя  прочитать  список  элементов;

                      нельзя  записать  в  области,  заданные

                      полями "адрес буфера"  и  "адрес  длины

                      возвращаемой информации" в  дескрипторе

                      элемента;

       SS$_BADPARAM   - задан неверный код элемента;

       SS$_IVLOCKID   - в аргументе  LKIDADR  задан  неверный

                      идентификатр захвата;

       SS$_IVMODE     - нужен более  привилегированный  режим

                      доступа;

       SS$_NOSYSLCK   - вызывающий процесс  пытался  получить

                      информацию об общесистемном захвате, не

                      имея привилегии SYSLCK;

       SS$_NOWORLD    - вызывающий процесс пытался,  не  имея

                      требуемой  привилегии  WORLD,  получить

                      информацию о захвате,  который  удержи-

                      вается процессом в другой группе;

       SS$_EXQUOTA    - вызывающий процесс имеет  недостаточ-

                      ную квоту ASTLM или BYTLM;

       SS$_INSFMEM    - не хватает  динамической  памяти  для

                      данной операции.

       Значения кода состояния, возвращаемые в блок состояния

  ввода-вывода такие же, как те, что возвращаются в R0.









        
!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!