8. ПРОДОЛЖИМ НАШИ ИГРЫ

8.1. Устройство виртуальной памяти

  Воображение — в действительности не что иное, как вид памяти, освобожденный от уз времени и пространства.
  Сэмюель Тейлор Кольридж

 

       — Ну вот и ключ,— сказал Алеша,— сбегав к Александру Геннадьевичу после того, как мы пришли с обеда,— и как же машине сказать, что можно работать?
       — А для этого нужно вставить ключ, повернуть его в положение "РАБОТА" и нажать клавишу "ПРОДОЛЖ". Вот и все.
       "Суть концепции виртуальной памяти заключается в том, что адреса, к которым обращается выполняющийся процесс, отделяются от адресов, реально существующих в первичной памяти" — такое определение виртуальной памяти дает в своей книге Харви Дейтел.
       — А как работать с устройством,— не понимает Алеша,— которое не представляет реального объекта, отделено от объективно существующей реальности?
       — С одной стороны, ты прав,— замечаю я,— наше новоявленное устройство (напомним, что оно появилось начиная с версии 5.0) не существует как некоторое самостоятельное устройство. Но вспомним, что мы говорили о файловой системе.
       — Файловая система может быть организована в любой памяти,— напоминает Алеша.
       — А почему этой памятью,— спрашиваю я,— не может быть память процессора? В СОТКЕ объем памяти составляет 256К байт, т.е. такой же как объем гибкой дискеты. А монитор RT11SJ использует только 64К байта (вместе с периферийными устройствами и программами пользователя). Почему бы в оставшуюся память не записать необходимую информации, которую мы рассматривали в пятой главе. А после этого работать с ней, как с устройством, имеющим файловую систему с произвольным доступом. Кстати, на "Электронике-85" я именно так и работаю. Скидываю на такое устройство всю дискету (400К байт) и еще место остается. И в результате мне неважно, какая операционная система стоит на "Винчестере", и в моем распоряжении два кармана НГМД.
       — Но как с ней работать,— настаивает Алеша,— разве что, сначала инициализировать его файловую систему так, как мы уже умеем?
       И Алеша ввел команду

  +---------------
  !  .INITIALIZE VM0:<ВК>
  !  -
  !  VM0:/INITIALIZE - Are you sure? Y<ВК>
  !  --------------------------------
  !  .^
  !

       — Видишь,— говорю я Алеше,— и ничего страшного не произошло. Сразу можно отметить, что так как память у процессора одна, то номер устройства значения не имеет, он просто игнорируется. И теперь можешь посмотреть его каталог.

  +---------------
  !  .DIR/FU/BL/VOL DM:<ВК>
  !
  !   14-May-88
  !   Volume ID: RT11A
  !   Owner    :
  !  < UNUSED >   376              8
  !   0 Files, 0 Blocks
  !   376 Free blcks
  !

       — И теперь,— обрадовался Алеша,— можно на это устройство скопировать файлы, которые имеются на нашем диске. Причем сделать это можно достаточно быстро. Не забыв про системные файлы, даем групповую (как громко сказано) спецификацию, введя команду:

  +--------------
  !  .COPY/SYSTEM SY: VM:<ВК>
  !  -
  !           Files copied:
  !           -------------
  !  SY:SWAP  .SYS  to  VM:SWAP  .SYS
  !  SY:TT    .SYS  to  VM:TT    .SYS
  !  SY:LD    .SYS  to  VM:LD    .SYS
  !  SY:DX    .SYS  to  VM:DX    .SYS
  !  SY:VM    .SYS  to  VM:VM    .SYS
  !  SY:RK    .SYS  to  VM:RK    .SYS
  !  SY:DP    .SYS  to  VM:DP    .SYS
  !  SY:MT    .SYS  to  VM:MT    .SYS
  !  SY:LP    .SYS  to  VM:LP    .SYS
  !  SY:PC    .SYS  to  VM:PC    .SYS
  !  SY:NL    .SYS  to  VM:NL    .SYS
  !  SY:SL    .SYS  to  VM:SL    .SYS
  !  SY:PIP   .SAV  to  VM:PIP   .SAV
  !  SY:DUP   .SAV  to  VM:DUP   .SAV
  !  SY:DIR   .SAV  to  VM:DIR   .SAV
  !  SY:LET   .SAV  to  VM:LET   .SAV
  !  SY:K52   .SAV  to  VM:K52   .SAV
  !  SY:DUMP  .SAV  to  VM:DUMP  .SAV
  !  SY:EDIT  .SAV  to  VM:EDIT  .SAV
  !  SY:FORMAT.SAV  to  VM:FORMAT.SAV
  !  SY:PATCH .SAV  to  VM:PATCH .SAV
  !  SY:STARTS.COM  to  VM:STARTS.COM
  !  SY:V5NOTE.TXT  to  VM:V5NOTE.TXT
  !  ?PIP-F-Device full VM:IND.SAV
  !

       И так она будет говорить про каждый файл,— возмутился Алеша,— но ведь я знаю, что копирую. Как бы запретить ей этот многословный рассказ.
       Мы, конечно, найдем такую возможность, но сначала отметим, что не все нужные нам файлы скопировались. Самое простое, так как эта система у нас создается для эксперимента, это удалить некоторые файлы и докопировать то, что нам нужно. Некоторые команды мы будем подробно обсуждать дальше, поэтому в этом случае используем их "молча".
       Для начала давай посмотрим,— говорю я,— что мы имеем на устройстве VM0.

  +---------------
  !  .DIR/FU/BL/VOL VM:<ВК>
  !  -
  !   14-Mar-88
  !   Volume ID: RT11A
  !   Owner    :
  !  SWAP  .SYS  26P 13-Jan-84   8     RT11SJ.SYS  73P 13-Jan-84  34
  !  TT    .SYS   2P 13-Jan-84 107     LD    .SYS   8P 13-Jan-84 109
  !  DX    .SYS   4P 13-Jan-84 117     VM    .SYS   3P 13-Jan-84 121
  !  RK    .SYS   3P 13-Jan-84 124     DP    .SYS   3P 13-Jan-84 127
  !  MT    .SYS   9P 13-Jan-84 130     LP    .SYS   2P 13-Jan-84 139
  !  PC    .SYS   2P 13-Jan-84 141     NL    .SYS   2P 13-Jan-84 143
  !  SL    .SYS  13P 13-Jan-84 145     PIP   .SAV  29P 13-Jan-84 158
  !  DUP   .SAV  45P 13-Jan-84 187     DIR   .SAV  19P 13-Jan-84 232
  !  LET   .SAV   5P 13-Jan-84 251     K52   .SAV  55P 13-Jan-84 256
  !  DUMP  .SAV   8P 13-Jan-84 311     EDIT  .SAV  19P 13-Jan-84 319
  !  FORMAT.SAV  21P 13-Jan-84 338     PATCH .SAV   9P 13-Jan-84 359
  !  STARTS.COM   1P 13-Jan-84 368     V5NOTE.TXT   2P 13-Jan-84 369
  !  < UNUSED >  13            371
  !   24 Files, 363 Blocks
  !   13 Free blocks
  !

       Мы видим, что у нас только 13 свободных блоков, а нам нужно 52 блока. И для начала удалим два файла — K52.SAV и FORMAT.SAV, используя для этого команду:

  +---------------
  !  .DELETE VM:(K52,FORMAT).SAV<ВК>
  !  -
  !  ?PIP-W-Protected file VM:K52.SAV
  !  --------------------------------
  !  ?PIP-W-Protected file VM:FORMAT.SAV
  !  -----------------------------------
  !  .^
  !  -
  !

       — А она не хочет,— сказал Алеша.
       Вот мы и почувствовали силу защиты файлов. Но так как мы имеем право (как и любой пользователь RT-11) снять защиту, то воспользуемся им:

  +---------------
  !  .UNPROTECT VM:(K52,FORMAT).SAV<ВК>
  !  -
  !

после чего можно и удалить

  +---------------
  !  .DELETE VM:(K52,FORMAT).SAV<ВК>
  !  -

!

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

  +---------------
  !  .DIR/FU/BL/VOL VM:<ВК>
  !  -
  !   14-Mar-88
  !   Volume ID: RT11A
  !   Owner    :
  !  SWAP  .SYS  26P 13-Jan-84   8     RT11SJ.SYS  73P 13-Jan-84  34
  !  TT    .SYS   2P 13-Jan-84 107     LD    .SYS   8P 13-Jan-84 109
  !  DX    .SYS   4P 13-Jan-84 117     VM    .SYS   3P 13-Jan-84 121
  !  RK    .SYS   3P 13-Jan-84 124     DP    .SYS   3P 13-Jan-84 127
  !  MT    .SYS   9P 13-Jan-84 130     LP    .SYS   2P 13-Jan-84 139
  !  PC    .SYS   2P 13-Jan-84 141     NL    .SYS   2P 13-Jan-84 143
  !  SL    .SYS  13P 13-Jan-84 145     PIP   .SAV  29P 13-Jan-84 158
  !  DUP   .SAV  45P 13-Jan-84 187     DIR   .SAV  19P 13-Jan-84 232
  !  LET   .SAV   5P 13-Jan-84 251     < UNUSED >  55            256
  !  DUMP  .SAV   8P 13-Jan-84 311     EDIT  .SAV  19P 13-Jan-84 319
  !  < UNUSED >  21            338     PATCH .SAV   9P 13-Jan-84 359
  !  STARTS.COM   1P 13-Jan-84 368     V5USER.TXT   2P 13-Jan-84 369
  !  < UNUSED >  13            371
  !   24 Files, 363 Blocks
  !   13 Free blocks
  !

а также можно посмотреть реальный каталог удаленных файлов командой

  +---------------
  !  .DIRECTORY/DELETE VM:<ВК>
  !  -
  !   14-Mar-88
  !   Volume ID: RT11A
  !   Owner    :
  !  K52   .SAV  55  13-Jan-84 256     FORMAT.SAV  21  13-Jan-84 338
  !  EMPTY .FIL  13            371
  !   24 Files, 363 Blocks
  !   89 Free blocks
  !

       Конечно, пустые места на диске, разбросанные как попало, не очень вредят, если они достаточно большие. Но лучше, чтобы свободное место было одним большим куском, а файлы при этом были "прижаты" к началу тома (как мы помним, у дисков более надежные записи на внешних дорожках). Тем более что нам нужен 51 блок одним куском.
       — А для этого мы должны,— говорит Алеша,— найти в русско-английском словаре слово СЖИМАТЬ и использовать его в качестве команды:

  +---------------
  !  .SQUEEZE VM:<ВК>
  !  -
  !  VM:/Squeeze; Are you sure? Y<ВК>
  !  ---------------------------
  !  .^
  !

       и сразу ответим на этот предостерегающий вопрос. Почему система его задала? Мы ведь ничего не хотели удалять?
       — И все-таки вопрос не лишний,— поясняю я,— при сжатии тома появляется ситуация, когда нарушается адекватное соответствие между файлом и записью о нем в каталоге (см. первую главу), кроме того, возможно и нарушение целостности самого файла. Поэтому вопрос предлагает подумать, действительно ли мы уверены в надежности аппаратуры и носителей.
       Правда в последних версиях системы программа DUP стала более умной. Она не только оставляет на месте файлы с типом .BAD, но и может создать их сама, если обнаружит плохие блоки во время выполнения операции SQUEEZE.
       Однако и мы можем предпринять меры к сохранности информации. Если мы укажем ключ /OUTPUT:DEV:, у которого в качестве аргумента используется имя выходного устройства, то навязчивого вопроса не будет, а файлы будут переписаны на выходное устройство. При этом в операции не участвуют плохие файлы и загрузчики в начале тома.
       Говоря о том, как эту операцию выполнить без помощи KMON

  +---------------
  !  .RUN SY:DUP<ВК>
  !  *[output:=]VM:/SYS<ВК>
  !  *^C^C
  !  .^
  !

       отметим, что ключ /WAIT здесь также может быть использован, а при сжатии системного тома происходит автоматическая перезагрузка системы для восстановления указателей на драйверы в таблицах монитора.
       — Осталось посмотреть на плоды своих трудов,— сказал Алеша.

  +---------------
  !  .DIR/FU/BL/VOL VM:<ВК>
  !  -
  !   14-Mar-88
  !   Volume ID: RT11A
  !   Owner    :
  !  SWAP  .SYS  26P 13-Jan-84   8     RT11SJ.SYS  73P 13-Jan-84  34
  !  TT    .SYS   2P 13-Jan-84 107     LD    .SYS   8P 13-Jan-84 109
  !  DX    .SYS   4P 13-Jan-84 117     VM    .SYS   3P 13-Jan-84 121
  !  RK    .SYS   3P 13-Jan-84 124     DP    .SYS   3P 13-Jan-84 127
  !  MT    .SYS   9P 13-Jan-84 130     LP    .SYS   2P 13-Jan-84 139
  !  PC    .SYS   2P 13-Jan-84 141     NL    .SYS   2P 13-Jan-84 143
  !  SL    .SYS  13P 13-Jan-84 145     PIP   .SAV  29P 13-Jan-84 158
  !  DUP   .SAV  45P 13-Jan-84 187     DIR   .SAV  19P 13-Jan-84 232
  !  LET   .SAV   5P 13-Jan-84 251     DUMP  .SAV   8P 13-Jan-84 256
  !  EDIT  .SAV  19P 13-Jan-84 264     PATCH .SAV   9P 13-Jan-84 283
  !  STARTS.COM   1P 13-Jan-84 292     V5USER.TXT   2P 13-Jan-84 293
  !  < UNUSED >  89            295
  !   22 Files, 287 Blocks
  !   89 Free blocks
  !

       И скопировать с системного тома недостающие файлы:

  +---------------
  !  .COPY SY:(IND,DATIME) VM:<ВК>
  !  -
  !            Files copied
  !            ------------
  !  SY:IND   .SAV  to  VM:IND   .SAV
  !  SY:DATIME.COM  to  VM:DATIME.COM
  !  .^
  !

       И так как система снова стала рассказывать о том, что она делает, я предлагаю Алеше разобраться с этим вопросом.
       — Попробуй сделать ее немногословной,— говорю я ему,— но для этого ты должен для ключа подобрать слово, отражающее смысл происходящего явления.
       — Ну это просто,— говорит Алеша,— ведь она как судья, в велосипедной гонке на длинные дистанции, протоколирует, записывая в своей книжке время прохождения каждого круга.
       — Сравнение правильное,— говорю я,— но если ты хочешь использовать слово PROTOCOL, которое так и хочет сорваться у тебя с языка, то будешь неправ.
       — А как же тогда быть,— удивился Алеша,— может быть словарь Гэлланда нам поможет?
       — Увы, Алеша,— останавливаю я его,— у Гэлланда ты можешь найти нужное слово, но для этого тебе придется перерыть весь словарь, а слово PROTOCOL тебе не поможет, потому что давно используется в другом значении. И вообще, отталкиваясь от русского языка, нужное нам слово не найти. Далеко не всегда языки разных народов переплетаются так близко, как мы видели до сих пор. Я лучше тебе расскажу историю, которая возможно отражает превращения нужного нам слова.
       Дело было очень давно. Соединенных Штатов Америки тогда еще не было. И язык был не американский, а английский. Англия — страна островная, имеющая много колоний в разных странах света, славилась своими мореплавателями. Вот и подсмотрим за капитаном древнего английского судна.
       Понимали капитаны, что без измерения скорости судна нельзя рассчитать и время в пути, и, следовательно, хватит ли провианта на дорогу. Вот и придумали привязывать на веревку кусок бревна (LOG — бревно, кусок бревна) и бросать получившийся лаг (the LOG), как его стали называть, в воду. Чем сильнее отклоняется веревка с куском бревна, тем больше скорость. А чтобы легче было замерять скорость, т.е. отклонение веревки, и сравнивать с предыдущими замерами, прибили к борту судна доску (Log-board — доска для записи показаний лага), на которой отмечали отклонение лага. И если ты вспомнишь, что на кораблях всего мира всегда идеальный порядок, все события, происходящие на корабле, записываются в журнал — бортовой или вахтенный (Log-book), то неужели такое важное событие, как скорость корабля, не будет зафиксировано в нем.
       Вполне вероятно, что именно необходимость записывать скорость судна на протяжении всего пути и неудобство доски для этой цели привели к появлению бортового журнала (а так как скорость корабля записывалась при сдаче вахты, то и вахтенного), в котором последовательно, в строгом временном порядке, производились записи.
       — Но при чем здесь вычислительные машины?— удивился Алеша.
       — А ты посмотри,— замечаю я Алеше,— как последовательно система записывала на экране (и как это было в первых версиях на печатающем устройстве) все, что она сделала.
       — И правда,— подхватил Алеша,— значит, слово LOG, которое является в английском языке сокращением от всех упомянутых Вами слов и которое дословно означает "Запись о событии в вахтенном или бортовом журнале", будет являться ключем, разрешающим протоколирование системой выполняемых ею действий. И, соответственно, запрещающим ключем будет /NOLOG. И здесь очень важно отметить свойство этой записи — каждая такая запись является последней в момент ее создания. Кроме того, на экране запись о копировании файла возникает только после успешного выполнения операции.
       — И здесь ты совершенно прав. Но продолжим разговор об этом слове, раз мы уж углубились в эти изыскания. На этом слове в операционных системах базируется целый комплекс понятий. Например, чтобы ты сказал про слово LOGIN?
       — Конечно, в свете вышесказанного?— уточнил Алеша.— Практически дословно можно сказать, что это команда кому-то — "Запиши [мой] вход".
       — Правильно, и в первых версиях (включая 3.0) были такие команда и программа, ее обслуживающая, которая записывала в определенном файле информацию, кто вошел в систему и когда.
       — И тогда,— продолжает Алеша,— логично будет, чтобы была команда, завершающая работу пользователя в системе, и записывающая время завершения работы данного пользователя. И называться она должна — LOGOUT.
       — Но так как,— продолжаю я,— RT-11 стала чисто однопользовательской системой, то эти команды ей просто не нужны. Но помнить о них нужно, потому что это самые распространенные команды входа в систему и выхода из нее в многопользовательских операционных системах. И кроме того, в дальнейшем мы еще раз столкнемся как с самим словом LOG, так и с его функциональным значением.
       А теперь вернемся к нашим баранам,— вывожу я из задумчивости Алешу,— что нам нужно сделать с виртуальной памятью (устройством VM:), чтобы загрузиться с него, как с диска. Мы ведь уже отмечали, что это возможно.
       — А мы уже говорили,— уверенно отвечает Алеша,— что для одинаковых функций не нужно придумывать новые команды. Мы рассматриваем устройство VM как диск, поэтому скопируем загрузчик монитора так же, как на диске, и таким же образом загрузим систему с устройства VM:.

  +---------------
  !  .COPY/BOOT VM:RT11SJ VM:<ВК>
  !  -
  !  .BOOT VM:<ВК>
  !  -
  !
 
     RT-11SJ  V5.1B (S)
   .SET TT QUIET
 
 
                             RT-11 V5.1
                             ----------
 
       Installation  of  RT-11 version 5.1 is complete and you are
  now  executing  from  the working volume (provided you have used
  the  automatic  installation  procedure).  Digital recomends you
  verify the correct operation of your system's software using the
  verification procedure. To do this, enter the command:
 
                             IND VERIFY
 
       Note that verify should be performed only after the distri-
  bution  media have been backed up. This was accomplished as part
  of  automatic  installation  on  all  RL02, RLX02 and RX50 based
  systems, including the micro/PDP-11 and the Professional 300. If
  you  have not completed automatic installation, you must perform
  a  manual  backup  before using VERIFY. Note also, VERIFY is not
  supported   on   RX01  diskettes,  DECtape   I  or  II,  or  the
  Professional 325.
 
   RT-11 Single Job monitor,  Volume ID   RT11A
   Booted on 23-Sep-86 at 09:11:12 from file VM0:RT11SJ.SYS
   @<EOF>
   .^

       — Вот и все,— говорит Алеша,— и теперь можно выключать диски? На их контроллере ни одна лампочка не мигает.
       — Конечно, можно,— отвечаю я,— при условии, что вся необходимая тебе информация находится на устройстве VM: или на каких-либо других носителях. Если бы мы работали на ЭВМ "Электроника-79" или СМ-1420, у которых объем памяти достигает 4М байт, то мы могли бы переписать на устройство VM: почти полтора жестких диска RK:, выключить их, чтобы не изнашивались, а поработав, скопировать сделанное назад, на RK. И работать быстрее, и диски не портятся.
       — Но если что-нибудь случится,— вспомнил Алеша наши приключения,— например, выключат электричество — вся работа может пропасть.
       — Конечно, и поэтому прежде, чем решаться на подобные эксперименты, нужно убедиться в надежности аппаратуры и электропитания в помещении.
       Однако много программ создают во время своей работы промежуточные файлы, которые, во-первых, не нужны после получения окончательных результатов и, во-вторых, их всегда можно получить снова. А ты помнишь, как эти промежуточные файлы разбивают на кусочки пространство на диске — так пусть занимаются этим делом где-нибудь на стороне.
       — И,— догадался Алеша,— устройство VM: самое подходящее для этого место.
       — Правильно.
       Но продолжим работу.

 

8.2. Логические диски

       — Алеша, мы ведь не так часто будем работать на СОТКЕ,— напоминаю я,— пока нам более доступен ДВК. Поэтому я предлагаю, раз мы имеем такую возможность, подготовить новую систему для ДВК.
       — Но она же будет отличаться от старой,— заметил Алеша,— и, наверное, от той, с которой мы сейчас работаем?
       — Это не страшно. От старой она будет отличаться только дополнительными программами, которые мы скопировали с архивного диска. Мелкие улучшения, которые в ней произошли, мы отметим по пути, когда с ними столкнемся. Таким образом, все, что мы говорили до сих пор, действительно и для этой системы. И во-вторых, от той системы, с которой мы сейчас работаем, она будет отличаться только размерами диска.
       — То есть это в нашей власти,— удовлетворенно заметил Алеша,— менять ее возможности и носители.
       — Конечно,— отвечаю я,— но это было не всегда. До появления версии 4.0 каждый монитор "знал" только свое устройство, и такой простой возможности переходить от устройства к устройству не было. Это, например, касается тех версий ОС ДВК, которые имеют монитор MXMNSJ.SYS, соответствующий RT-11SJ V3.0. А для начала мы создадим виртуальную модель нашего гибкого диска прямо на нашем рабочем жестком диске. Он ведь надежнее, и будет, таким образом, хранить эталон нашей рабочей системы. Ты, конечно, помнишь полный объем гибкого диска?
       — Да,— отвечает Алеша,— 494. блока вместе с каталогом.
       — Прекрасно,— ставлю ему задачу,— тогда нужно создать на диске RK3: файл размером 494. блока, и пусть для начала он находится на любом свободном месте.
       — Ага,— догадался Алеша,— опять дословный перевод на английский?
       И не теряя времени набрал команду.

  +---------------
  !  .CREATE/ALLOCATE:494. RK3:DVK2M.DSK<ВК>
  !  -
  !  .^
  !

       Пусть наш файл называется так же, как и комплекс, на котором мы в основном работаем. И его тип отражает тот факт, что это будет диск. А размер мы зарезервируем ключем /ALLOCATE, какой нам нужно.
       — Ну что же,— говорю я,— неплохо для начала. А если посмотреть, что получилось? Только, пожалуйста, не выводи полный каталог.
       — Пожалуйста,— Алеша ввел команду:

  +---------------
  !  .DIR/FU/BL/VOL RK3:DVK*<ВК>
  !  -
  !   14-Mar-88
  !   Volume ID: RT-11SJ V5.1
  !   Owner    : Дотошкин Ал.
  !  DVK2M .DSK  494  14-Mar-88 425   < UNUSED >  3881            919
  !   1 Files, 494 Blocks
  !   3881 Free blocks
  !

       Как и полагается, мы увидели в каталоге запись о файле.
       — Правильно, Алеша,— уточняю я,— именно запись. Здесь мы посоветуем читателю вернуться к первой главе. В действительности файла, как такового, еще нет. Мы не знаем, как организована информация (и, вообще, имеет ли она для нас значение) в той области диска, на которую указывает запись в каталоге. Пока еще нет адекватного соответствия записи о файле и файла, как объекта.
       Однако необходимо как-то связать эту область на диске, используя, конечно, эту запись о ней в каталоге, с устройством LDN: (Logical Disk) с каким-нибудь номером. Как это сделать?
       — Это уже сложно,— нахмурил брови Алеша,— ведь логичнее связывать какие-нибудь постоянные объекты. А здесь мы подчеркиваем, что с устройством LD: можно обращаться, как с диском.
       — Это так Алеша,— говорю я,— но если ты хочешь работать с диском, то присмотрись, как устанавливается большинство дисков и диск-пакетов.
       — Они устанавливаются сверху,— оживился Алеша,— и опять лезть в словари?
       — Конечно,— подаю я ему оба словаря,— сначала найди в русско-английском словаре слово "устанавливать".
       — Нашел,— говорит Алеша,— тут очень много значений, отражающих разные стороны жизни. Но технических терминов только два — MOUNT и INSTALL.
       — Вот и вычисли логическим путем, как Шерлок Холмс, какой из них нам поможет.
       — А для этого я пойду от обратного,— говорит Алеша,— посмотрим, как определяет слова MOUNT и INSTALL англо-русский словарь.
       Удивительно, но слово INSTALL имеет основное значение — официальное введение в должность. Анализируя остальные значения, которых достаточно много, можно сказать, что обобщенный смысл слова INSTALL — устанавливать на место, вводя (водворяя, помещая) вовнутрь.
       — Алеша,— замечаю я,— ты сейчас прикоснулся к очень интересной проблеме: имея одинаковый смысл, слова могут отражать традиции их употребления. Во всяком случае, все, что ты сказал про слово INSTALL, постарайся запомнить.
       — Так, значит, не оно,— Алеша, не унывая, перекинул пару сотен страниц в словаре,— тогда я нашел слово MOUNT. У него еще больше значений. Все они так или иначе связаны с горой. И в нашем случае — это "устанавливать на возвышение". Можно в шутку сказать, что логический диск взгромоздился на файл, который находится на жестком диске.
       — Вот именно — взгромоздился. Теперь осталось определить синтаксис команды.
       — А в этом нам помогут те поиски смысла слов, которые мы только что осуществили,— Алеша взялся за карандаш,— команда нам ясна. Файл, который должен быть связан с логическим диском, находится на жестком диске RK3:. Поэтому логический диск мы должны "взгромоздить на файл, и, соответственно, на жесткий диск. И если сказать эту фразу полностью — взгромоздить LD4: на файл RK3:DVK2M.DSK.
       И Алеша ввел команду:

  +---------------
  !  .MOUNT LD4: RK3:DVK2M.DSK<ВК>
  !  -
  !  .^
  !

       И сразу посмотрим, что изменилось в каталоге.

  +---------------
  !  .DIR/FU/BL/VOL RK3:DVK*<ВК>
  !  -
  !   14-Mar-88
  !   Volume ID: RT-11SJ V5.1
  !   Owner    : Дотошкин Ал.
  !  DVK2M .DSK  494P 14-Mar-88 425   < UNUSED >  3881             919
  !   1 Files, 494 Blocks
  !   3881 Free blocks
  !

       Ничего не изменилось, кроме одного признака — файл стал защищенным, т.е. его нельзя удалить. Но с другой стороны, система теперь знает, что файл RK3:DVK2M.DSK может рассматриваться как устройство LD4:. А значит, можно повторить все операции по инициализации файловой системы на этом устройстве. Можно также заметить, что команда MOUNT по умолчанию требует тип файла .DSK, однако если пользователь его указывает явно, то тип файла может быть любой.
       — Вот так и сделаем,— обрадовался Алеша,— и после этого скопируем все файлы нашей рабочей системы на устройство LD4:.
       И Алеша ввел команду.

  +---------------
  !  .INITIALIZE/VOLUMEID LD4:<ВК>
  !  -
  !  LD4:/INITIALIZE - Are you sure? Y<ВК>
  !  --------------------------------
  !  Volume  ID: RT-11SJ V5.1<ВК>
  !  ------------
  !  Owner name: Дотошкин Ал.<ВК>
  !  ------------
  !  .COPY/SYSTEM/NOLOG SY: LD4:<ВК>
  !  -
  !  ?PIP-F-Device full LD4:DVK2M.DSK
  !  --------------------------------
  !  .^
  !  -

       — Ого,— улыбнулся Алеша,— она попыталась скопировать сам файл логического диска на устройство LD4:. Ведь я опять дал групповую спецификацию файлов. И ничего страшного не случилось. Ведь файл DVK2M.DSK расположен последним на диске RK3:, и все, что нам нужно было скопировать, влезло.
       — Да, это тот случай, когда на фатальные ошибки можно смотреть спокойно. Кроме того, иногда для упрощения команды можно использовать такие приемы.
       — Да, но теперь нужно записать загрузчик монитора в начальные блоки тома,— здесь Алеша задумался,— и какой загрузчик должен быть, какой монитор в первую очередь он должен загрузить и с какого устройства?
       — Вот сколько вопросов сразу,— пытаюсь я помочь Алеше,— давай подумаем сначала над таким вопросом — можем ли мы загрузить систему из логического диска при включении ЭВМ и что для этого нужно?
       — Для этого нужно выполнить следующие действия,— Алеша начал перечислять:
       — аппаратный загрузчик должен загрузить систему с какого-нибудь физического диска, в нашем случае с RK3:;
       — эта система должна узнать, с каким номером логического диска какой файл связан, например из команды MOUNT;
       — после этого система должна знать, из какого логического диска нужно загружаться, ведь на физическом диске могут находиться несколько файлов, связанных с логическими дисками и т.д. и т.п.
       — Алеша, а не слишком ли сложно,— останавливаю я его,— может быть, просто скажем пользователю, что загрузка системы может производиться только с физических устройств.
       — А как же тогда виртуальная память,— спрашивает Алеша,— наше несуществующее устройство VM:?
       — Конечно, устройство VM: реально не существует. Но память у процессора реально существует и, более того, ее расположение всегда известно. И после загрузки операционной системы с диска известно состояние всех устройств управления этой памятью. Кроме того, ты ведь производишь загрузку с VM:, находясь в клавиатурном мониторе, а не с помощью аппаратного загрузчика. Поэтому в данном случае мы можем считать устройство VM: реальным.
       — Тогда поставим вопрос по другому,— не отступает Алеша от своей идеи,— мы говорили, что в этом файле создадим эталонную копию системы для ДВК. Как бы слепок с дискеты диаметром 8 дюймов. Можем ли мы записать на этот том загрузчик того устройства, на котором система будет реально существовать.
       — Вот это уже другое дело, для этого достаточно указать в команде копирования загрузчика имя устройства (из двух символов). Нужно только отметить, что такая возможность появилась только с версии 4.0 и предлагается фирмой DEC совершенно для других целей, но так как логика команды это позволяет, мы можем использовать в данном случае свои имена устройств.
       — Наверное, наше уточнение,— Алеша уже начал набирать команду,— должно учитывать стиль команд, разобранных выше. Например, так:

  +---------------
  !  .COPY/BOOT:DX LD4:RT11SJ LD4:<ВК>
  !  -
  !  .^
  !  -

       и опять необходимо отметить правило — копировать загрузчик монитора, находящегося на том же устройстве, начальные блоки которого он копируется.
       — И последнее, что тебе нужно сделать,— говорю я Алеше,— это скопировать устройство LD4: на устройство DX: и после этого загрузиться с устройства DX0:.
       — Это уже не сложно,— уверенно отвечает Алеша,— мы хотим скопировать одно устройство на другое и поэтому должны об этом сказать в команде COPY.

  +---------------
  !  .COPY/DEVICE LD4: DX0:<ВК>
  !  -
  !  DX0:/COPY; Are you sure? Y<ВК>
  !  ------------------------
  !  .BOOT DX0:<ВК>
  !  -

       И когда после красивой картинки появилась точка, мы можем сказать, что сделали все правильно и в результате наших действий "пересели на другую табуретку", т.е. в качестве системного устройства теперь используется DX0:.
       — Ну, Алеша, и погулял ты сегодня по устройствам,— шучу я,— системным устройством у тебя сегодня были и RK3:, и VM:, и теперь DX:. Нечто похожее происходит, когда ты работаешь в таких популярных системах, как CP/M, MS-DOS, RSX-11 или UNIX, только там они не системные, а твои рабочие (на данный момент времени) устройства.

 

8.3. А если обмануть систему,
или
Работа только с каталогами

       — А как это?— недоуменно спрашивает Алеша, прочитав это название.
       — А ты не торопись,— отвечаю я,— а для начала попробуй выполнить некорректные действия — скопируй устройство LD4: на устройство VM:.
       — Только мы должны проинициализировать устройство VM:,— сказал Алеша,— а уж потом...

  +---------------
  !  .INI/NOQUERY VM:<ВК>
  !  -
  !  .COPY/DEVICE LD4: VM:<ВК>
  !  -
  !  Output device to small; Are you sure? Y<ВК>
  !  --------------------------------------
  !  .^
  !  -

       ... скопировали,— Алеша удивленно заморгал глазами,— но ведь все файлы не должны были влезть, мы уже с этим сталкивались. А если мы посмотрим каталог:

  +---------------
  !  .DIR/FU/BL/VOL VM:<ВК>
  !  -
  !

       то в нем есть все файлы.

   21-Mar-88
   Volume ID: RT-11SJ V5.1
   Owner    : Дотошкин Ал.
  SWAP  .SYS  26P 13-Jan-84   8     RT11SJ.SYS  73P 13-Jan-84  34
  TT    .SYS   2P 13-Jan-84 107     LD    .SYS   8P 13-Jan-84 109
  DX    .SYS   4P 13-Jan-84 117     VM    .SYS   3P 13-Jan-84 121
  RK    .SYS   3P 13-Jan-84 124     DP    .SYS   3P 13-Jan-84 127
  MT    .SYS   9P 13-Jan-84 130     LP    .SYS   2P 13-Jan-84 139
  PC    .SYS   2P 13-Jan-84 141     NL    .SYS   2P 13-Jan-84 143
  SL    .SYS  13P 13-Jan-84 145     PIP   .SAV  29P 13-Jan-84 158
  DUP   .SAV  45P 13-Jan-84 187     DIR   .SAV  19P 13-Jan-84 232
  LET   .SAV   5P 13-Jan-84 251     K52   .SAV  55P 13-Jan-84 256
  DUMP  .SAV   8P 13-Jan-84 311     EDIT  .SAV  19P 13-Jan-84 319
  FORMAT.SAV  21P 13-Jan-84 338     PATCH .SAV   9P 13-Jan-84 359
  STARTS.COM   1P 13-Jan-84 368     V5USER.TXT   2P 13-Jan-84 369
  IND   .SAV  51P 13-Jan-84 371     DATIME.COM   1P 13-Jan-84 422
  < UNUSED >  71            423
   26 Files, 415 Blocks
   71 Free blocks

       — Алеша,— говорю я,— давай вернемся к первой главе, вспомни рисунок, в котором мы показали руки и глаза системы. Это как раз та ситуация, когда правая рука не ведает, что делает левая. Программа DUP скопировала, с нашего благословения, большое устройство на маленькое, столько, сколько влезло, т.е. последних файлов, указанных в каталоге, не существует. Так как программа DIR также работает только с каталогами, то и показывает нам, нисколько над этим не задумываясь, каталог устройства несоответствующий реальному.
       Чтобы лучше понять это (а точнее прочувствовать), давай создадим в виде файла логического диска только каталог LD4:.
       — Да, но для этого необходимо конструировать команду. Ключи, которые мы использовали раньше, если их смысл соответствует нашим целям, не будем придумывать снова. Итак, мы опять копируем устройство на устройство, поэтому используем команду COPY/DEVICE. Но так как мы копируем не все устройство, а только часть его, то используем ключи /START и /END для входного устройства и в качестве аргументов — номера блоков начала и конца копируемой области.
       — Алеша,— напоминаю я ему,— не забудь, что в результате мы должны получить файл, который можно потом будет связать с логическим диском.
       — Конечно,— парирует Алеша,— и для того чтобы в каталоге выходного устройства была создана запись с указанным именем и типом файла, после спецификации выходного файла укажем ключ /FILES.

  +---------------
  !  .COPY/DEV LD4:/START:0/END:12. RK3:KATAL.DSK/FILES<ВК>
  !  -
  !  RK3:KATAL.DSK/COPY; Are you sure? Y<ВК>
  !  ----------------------------------
  !  .DIRECTORY/FULL/BLOCKS/VOLUMEID RK3:<ВК>
  !  -
  !  .^
  !  -

       И убедились в том, что появился файл размером 13 блоков.

   21-Mar-88
   Volume ID: RT-11SJ V5.1
   Owner    : Дотошкин Ал.
  SWAP  .SYS   26P 13-Jan-84  10     RT11SJ.SYS  73P 13-Jan-84  36
  TT    .SYS    2P 13-Jan-84 109     LD    .SYS   8P 13-Jan-84 111
  DX    .SYS    4P 13-Jan-84 119     VM    .SYS   3P 13-Jan-84 123
  RK    .SYS    3P 13-Jan-84 126     DP    .SYS   3P 13-Jan-84 129
  MT    .SYS    9P 13-Jan-84 132     LP    .SYS   2P 13-Jan-84 141
  PC    .SYS    2P 13-Jan-84 143     NL    .SYS   2P 13-Jan-84 145
  SL    .SYS   13P 13-Jan-84 147     PIP   .SAV  29P 13-Jan-84 160
  DUP   .SAV   45P 13-Jan-84 189     DIR   .SAV  19P 13-Jan-84 234
  LET   .SAV    5P 13-Jan-84 253     K52   .SAV  55P 13-Jan-84 258
  DUMP  .SAV    8P 13-Jan-84 313     EDIT  .SAV  19P 13-Jan-84 321
  FORMAT.SAV   21P 13-Jan-84 340     PATCH .SAV   9P 13-Jan-84 361
  STARTS.COM    1P 13-Jan-84 370     V5USER.TXT   2P 13-Jan-84 371
  IND   .SAV   51P 13-Jan-84 373     DATIME.COM   1P 13-Jan-84 424
  DVK2M .DSK  494P 16-Mar-86 425     KATAL .DSK  13  21-MaR-88 919
  < UNUSED > 3868            932
   28 Files, 922 Blocks
   3868 Free blocks

       — А теперь, Алеша,— предлагаю я,— смонтируй получившийся файл (размером 13. блоков) с логическим диском, например LD2:, и посмотри его каталог.
       — Сейчас,— включился в игру Алеша,— только я каталог распечатаю покомпактней.

  +---------------
  !  .MOUNT LD2: RK3:KATAL<ВК>
  !  -
  !  .DIR/FAST/FULL LD2:<ВК>
  !  -
 
   21-MAR-88
  SWAP  .SYS    RT11SJ.SYS    TT    .SYS    LD    .SYS    DX    .SYS
  VM    .SYS    RK    .SYS    DP    .SYS    MT    .SYS    LP    .SYS
  PC    .SYS    NL    .SYS    SL    .SYS    PIP   .SAV    DUP   .SAV
  DIR   .SAV    LET   .SAV    K52   .SAV    DUMP  .SAV    EDIT  .SAV
  FORMAT.SAV    PATCH .SAV    STARTS.COM    V5USER.TXT    IND   .SAV
  DATIME.COM    < UNUSED >
   26 Files, 415 Blocks
   71 Free blocks

       Вот здорово,— рассмеялся Алеша,— мы то знаем, что файл имеет размер 13. блоков. Однако программа DIR в каталоге показывает, что в нем имеются все (якобы) файлы и объем этого логического диска составляет 494. блока. Конечно, это игра, но позвольте вопрос — зачем это нужно.
       — Котята играют с собственным хвостом, чтобы потом лучше охотиться на мышей,— объясняю я,— наша игра в этом случае похожа на игру котят. Хотя многие каталоги в этой книге были получены способом, которым ты воспользовался сейчас.
       А если серьезно, то ты должен был заметить, что и в пятой главе, и в этой мы неявно рассматривали способы восстановления доступа к нужной информации в случае какой-нибудь аварии. Этим мы и занимаемся сейчас. Продемонстрировав различные случаи выделения каталогов из массива данных, мы показали способы восстановления информации. Как и в какой последовательности их применять, пользователь должен сообразить сам. Один из вариантов может быть такой.
       Если информация на большом диске (например, на диск-пакете или "Винчестере") хранится как бы упакованной в логические диски, то ее восстановление в случае потери основного каталога во многом упрощается. Начало логического диска найти очень просто — это те шесть блоков плюс как минимум два блока каталога, которые мы рассматривали в начале пятой главы. Найдя начало файла логического диска, можно в основном каталоге создать запись об этом файле, указав его размер, например 40. блоков, — это мы уже умеем — связать этот файл с каким-либо номером логического диска. Все вышеперечисленные действия не причиняют вреда той информации, до которой мы пока добраться не можем. Но посмотрев каталог, мы очень просто узнаем действительный размер нашего логического диска. А после этого можно дать "задний ход" — удалить нашу фиктивную запись в каталоге и создать новую, с действительным размером файла.
       — Команду для этого придумать нетрудно,— догадался Алеша,— достаточно добавить ключ /START:NBLK, указывающий абсолютный номер блока на томе.

  +---------------
  !  .CREATE RK3:PRIMER.DSK/START:600./ALLOCATE:40.<ВК>
  !  -
  !  .^
  !  -

       То, что ключи указаны не в команде, а после спецификации файла, не является требованием системы. Это просто логичнее с точки зрения естественного языка.
       — А можно ли это,— спрашивает Алеша,— сделать за один прием? Ведь в основном каталоге это место считается свободным. Можем ли мы увеличить созданный нами файл до нужного размера?
       — Попробуй,— предлагаю я ему,— но для этого тебе придется...
       — Найти соответствующий ключ,— перебивает меня Алеша,— и конечно же, в русско-английском словаре. Как всегда, здесь много значений, но одно прямо указывает на нашу цель — увеличение, в смысле расширения,— EXTENSION. Тогда остается только в качестве параметра использовать число, указывающее НА СКОЛЬКО БЛОКОВ нужно увеличить размер файла. Например:

  +---------------
  !  .CREATE RK3:KATAL.DSK/EXTENSION:481.<ВК>
  !  -
  !

и проверить

  +---------------
  !  .DIR/FU/BL/VOL RK3:KATAL<ВК>
  !  -
  !   21-MAR-88
  !   Volume ID: RT-11SJ V5.1
  !   Owner    : Дотошкин Ал.
  !  KATAL .DSK 494P 21-MAR-88 919    < UNUSED > 3387          1413
  !   1 Files, 494 Blocks
  !   3387 Free blocks

как и в остальных случаях мы опять можем обойтись без помощи KMON.
       Для создания записи о файле RK3:DVK2M.DSK пришлось бы воспользоваться программой DUP. Но так как аналога для ключа /ALLOCATE нет, то придется воспользоваться более сложным приемом:

  +---------------
  !  .RUN SY:DUP?ВК>
  !  -
  !  *RK3:DVK2M.DSK[494.]=/C<ВК>
  !  -
  !  *^C^C
  !  -
  !  .^

где число в квадратных скобках указывает на размер будущего файла.
       А для того чтобы при этом указать и номер блока, с которого будет начинаться файл, нужно добавить ключ /G:N.

  +---------------
  !  .RUN SY:DUP<ВК>
  !  -
  !  *RK3:PRIMER.DSK[40.]=/C/G:600.<ВК>
  !  -
  !  *^C^C
  !  -
  !  .^

       Однако до версии 4.0 (команды CREATE тогда еще не было) эта операция выполнялась иначе.

  +---------------
  !  .RUN SY:DUP<ВК>
  !  -
  !  *RK3:PRIMER.DSK=/C:600.:400.<ВК>
  !  -
  !  *^C^C
  !  -
  !  .^

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

  +---------------
  !  .RUN SY:DUP<ВК>
  !  -
  !  *RK3:KATAL.DSK=/T:481.<ВК>
  !  -
  !  *^C^C
  !  -
  !  .^

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

  +---------------
  !  .RUN SY:DUP<ВК>
  !  -
  !  *RK3:A=RK3:/I:425.:437.:919.<ВК>
  !  -
  !  RK3:/COPY; Are you syre? Y<ВК>
  !  -------------------------
  !  *RK3:KATAL.DSK/C/G:425.:12.<ВК>
  !  -
  !  *^C^C
  !  -
  !  .^

       теперь можно выполнять за один прием. Но сначала скажем, что при копировании для выходного устройства необходимо было указывать фиктивное имя файла "A", а в качестве параметров для ключа /I — (IMAGE — образ) нужно было последовательно указать начальный номер блока входного устройства, конечный номер блока входного устройства и начальный номер блока выходного устройства. В современных версиях (начиная с V4.0 и выше) эта операция выполняется много проще.

  +---------------
  !  .RUN SY:DUP<ВК>
  !  -
  !  *RK3:KATAL.DSK[/G:919.]=LD4:/I/G:0/E:12./F<ВК>
  !  -
  !  RK3:/COPY; Are you sure? Y<ВК>
  !  -------------------------
  !  *^C^C
  !  -
  !  .^

       Здесь используется то свойство, что интерпретатор командной строки (CSI) начиная с версии 4.0 умеет различать, к входному или выходному файлу относится ключ. Это в свою очередь позволило сделать команду логичнее и использовать меньший арсенал ключей. Ключ /F — FILES теперь указывает также на то, что копируется файл.
       — А действительно, все оказалось очень серьезным,— сказал Алеша.— А тот случай с двумя диск-пакетами вы также исправили.
       — Да, Алеша,— отвечаю я,— но так как на СОТКЕ есть еще одно устройство, с которым мы не можем работать на ДВК, перейдем к нему.

 

8.4. Копирование файлов на магнитную ленту

       — Да,— вспомнил Алеша,— мы про магнитофон всегда вспоминали только вскользь. Нужно же нам на нем когда-нибудь поработать.
       — А для этого возьми у Александра Геннадьевича на время чистую ленту,— говорю я Алеше. Такая лента должна всегда быть под рукой для всяких профилактических и промежуточных работ.
       — Вот принес,— Алеша сразу включил магнитофон и начал заправлять ленту. Как правило, на магнитофонах между подкассетниками есть рисунок, который показывает, как заправлять ленту, а мы покажем это на рисунке ниже.

  +----------========-========-========-========-=======-=======-+
  I вкл/выкл !ЗАГРУЗ! !ДИСТАН! !ПЕРЕМ.! !ВПЕРЕД! !НАЗАД! !СБРОС! I
  I----------========-========-========-========-=======-=======-I
  I              WWW                            +++              I
  I         WWWWWWWWWWWWW                  +           +         I
  I      WWWWWWWWWWWWWWWWWWW            +                 +      I
  I    WWWWWWWWWWWWWWWWWWWWWWW        +                     +    I
  I   WWWWWWWWWWWWWWWWWWWWWWWWW      +                       +   I
  I  WWWWWWWWWWWW***WWWWWWWWWWWW    +           ***           +  I
  I WWWWWWWWW***********WWWWWWWWW  +        ***********        + I
  I WWWWWWWW*************WWWWWWWW  +       *************       + I
  IWWWWWWWW***************WWWWWWWW+       ***************       +I
  IWWWWWWWW***************WWWWWWWW+       ***************       +I
  IWWWWWWWW***************WWWWWWWW+       \*************        +I
  I WWWWWWWW*************WWWWWWWW  +       \***********        + I
  I WWWWWWWWW***********WWWWWWWWW  +        \*********         + I
  I  WWWWWWWWWWWW***WWWWWWWWWWWW    +        \  ***           +  I
  I   WWWWWWWWWWWWWWWWWWWWWWWWW      +        \              +   I
  I    WWWWWWWWWWWWWWWWWWWWWWW        +        \            +    I
  I      WWWWWWWWWWWWWWWWWWW            +       \         +      I
  I         WWWWWWWWWWWWW                  +     \     +         I
  I          ....WWW./                          +++\..           I
  I        ./                                      WWW\          I
  I        WW   /--I"""""""""""""""""""""""""""-- WWWWI          I
  I        WW../   I                          I  \.WW/           I
  I................IWWWWWWWWWWWWWWWWWWWWWWWWWWI..................I

       — Все, готово,— отрапортовал Алеша,— заправил.
       — Ошибаешься,— поправляю его я,— нужно еще установить ленту на логическое начало — блестящий маркер. Для этого нажми последовательно и не торопясь кнопки "СБРОС" и "ЗАГРУЗКА". И только после того, как лента установится в начальное положение и загорятся индикаторы "ЗАГРУЗКА" и "ДИСТАН", магнитофон будет готов к работе. Кнопка-индикатор "ДИСТАН" позволяет переводить магнитофон в автономный режим и отключать его от ЭВМ.
       — Теперь,— Алеша уже действует самостоятельно,— нужно проинициализировать файловую систему.

  +---------------
  !  .INIT/VOL MT0:<ВК>
  !  -
  !  MT0:/INITIALIZE; Are you sure? Y<ВК>
  !  -------------------------------
  !  Volume  ID: ПРОБА<ВК>
  !  ------------
  !  Owner name: АЛЕША<ВК>
  !  ------------

       И сразу посмотреть каталог.

  +---------------
  !  .DIR/FU/BL/VOL MT0:<ВК>
  !  -
  !   21-MAR-88
  !   Volume ID: ПРОБА
  !   Owner    : АЛЕША
  !  < UNUSED >     0                 0
  !  0 Files, 0 Blocks
  !

       — А теперь,— подсказываю я Алеше,— попробуй скопировать файлы, например, из LD4: на ленту обычным способом.
       — Сейчас,— и Алеша ввел команду

  +---------------
  !  .COP/SYSTEM LD4: MT0:<ВК>
  !  -
  !             Files copied:
  !             -------------
  !  LD4:SWAP  .SYS  to  MT0:SWAP  .SYS
  !  . . . . . . . . . . . . . . . . .
  !  . . . . . . . . . . . . . . . . .

       — и она так перед каждым файлом будет перематывать ленту в начало,— возмутился Алеша,— так она и дырку протрет. Неужели ничего нельзя сделать?
       — Алеша,— успокаиваю я его,— прежде чем расстраиваться, распечатай каталог магнитной ленты, а потом вспомни пятую главу. И тогда вместе подумаем.
       — Да, но я надеюсь, что каталог она соберет за один проход,— рассерженный Алеша ввел команду:

  +---------------
  !  .DIR/FU/BL/VOL MT0:<ВК>
  !  -
 
   21-MAR-88
   Volume ID: ПРОБА
   Owner    : АЛЕША
  SWAP  .SYS  26  21-MAR-88   1     RT11SJ.SYS  73  21-MAR-88   2
  TT    .SYS   2  21-MAR-88   3     LD    .SYS   8  21-MAR-88   4
  DX    .SYS   4  21-MAR-88   5     VM    .SYS   3  21-MAR-88   6
  RK    .SYS   3  21-MAR-88   7     DP    .SYS   3  21-MAR-88   8
  MT    .SYS   9  21-MAR-88   9     LP    .SYS   2  21-MAR-88  10
  PC    .SYS   2  21-MAR-88  11     NL    .SYS   2  21-MAR-88  12
  SL    .SYS  13  21-MAR-88  13     PIP   .SAV  29  21-MAR-88  14
  DUP   .SAV  45  21-MAR-88  15     DIR   .SAV  19  21-MAR-88  16
  LET   .SAV   5  21-MAR-88  17     K52   .SAV  55  21-MAR-88  18
  DUMP  .SAV   8  21-MAR-88  19     EDIT  .SAV  19  21-MAR-88  20
  FORMAT.SAV  21  21-MAR-88  21     PATCH .SAV   9  21-MAR-88  22
  STWRTS.COM   1  21-MAR088  23     V5USER.TXT   2  21-MAR-88  24
  IND   .SAV  51  21-MAR-88  25     DATIME.COM   1  21-MAR-88  26
   26 Files, 415 Blocks

       — Интересно, а куда подевались начальные номера блоков,— удивился Алеша,— вместо них только порядковые номера файлов. И признака защиты файлов нет.
       — А по пути заметь, что дата создания файлов теперь указана сегодняшняя,— говорю я,— мы уже говорили, что при работе с лентой последняя по времени запись является последней на ленте. И изменение даты создания файлов, которое ты сейчас увидел, является следствием этого правила. И по этой причине нет признака PROTECT. Мы не можем удалить файл с ленты или переименовать его, поэтому эти признаки не имеют смысла.
       Кроме того, ты должен вспомнить, что понятие начального номера блока в данном случае не совсем корректно. С одной стороны, на каждый файл добавляется по метке начала и конца файла, каждая из которых занимает по одному блоку. С другой стороны, межфайловые промежутки не имеют строго определенных размеров. Поэтому более точно положение файла на ленте определяет его порядковый номер или позиция файла. Вот опираясь на него (или на нее) и попробуем управлять магнитофоном.
       Так как мы не указывали ключ /POSITION, то параметр при нем считался равным нулю. В принятой фирмой DEC стратегии (а она во многом схожа со стратегией в других системах) это означает, что перед записью очередного файла система возвращает ленту в исходное положение и просматривает ее в поиске такой же спецификации файла. Если до достижения метки конца тома будет встречен файл с таким же именем и типом, система напечатает на терминале сообщение и не будет делать копию этого файла. При чтении с ленты перемотка будет происходить перед поиском указанного файла. Если указано несколько файлов, то перемотка будет происходить перед поиском каждого из них. Этого можно избежать, если указать групповую спецификацию файлов. В таком случае перемотка произойдет только один раз, и система скопирует все определенные файлы.
       Другая ситуация получается, если мы укажем ключ /POSITION:N с положительным аргументом. При чтении с ленты сначала находится файл с соответствующим номером позиции, а затем сравнивается его имя и тип с указанным в командной строке. Если они совпадают, то файл копируется, в других случаях на терминале печатается сообщение об ошибке. Если же в командной строке была задана групповая спецификация файлов, то лента перематывается до указанной позиции, а уж после этого просматривается в поиске подходящих имен файлов. При записи система идет до указанного последовательного номера или метки конца тома, в зависимости от того, что раньше встретилось. После чего записывает указанный файл и новую метку конца тома. Если была указана групповая спецификация файлов, то система не перематывает ленту перед каждой записью и не проверяет дублирование имен файлов.
       — И это все?— спрашивает Алеша.
       — Нет,— отвечаю я,— можно дать еще и отрицательную позицию в качестве аргумента.
       Так если при чтении с ленты указать номер позиции равный -1, то поиск файла будет начинаться с текущей позиции, без перемотки ленты.
       Если же номер позиции равен -1 при записи на ленту, то лента перематывается только до конца предыдущего файла, а затем записывается указанный файл и метка конца тома.
       Если при использовании клавиатурного монитора мы для работы с магнитной лентой указываем ключ /POSITION:N, то при вызове программы PIP напрямую нужно указывать ключ /M:N, где N — параметр (номер позиции), указывающий, как работать с лентой. И операция копирования может быть выполнена так.

  +---------------
  !  .RUN SY:PIP<ВК>
  !  -
  !  *MT0:/M:-1=LD4:/Y<ВК>
  !  -
  !  *^C^C
  !  -
  !  .^

       И чтобы не возвращаться потом к СОТКЕ,— предлагаю я Алеше,— попробуй загрузить нашу вновь сформированную дискету на ДВК.
       — Я мигом,— побежал Алеша к нашему обычному месту,— а она опять ругается.

  +---------------
  !    RT-11SJ V5.1  (S)
  !
  !  ?LD-W-Device not installed RK3:
  !  ?LD-W-Device not installed RK3:
  !

       — Алеша,— спрашиваю я,— а с какими логическими дисками на RK3: ты связывался?
       — С LD2: и LD4:,— отвечает Алеша,— но они были на RK3:. Неужели LD-драйвер их запомнил. Как же теперь от них отказаться?
       — Наверное,— подсказываю я,— нужно выполнить операцию, обратную монтированию этих дисков. А для этого придется поискать приставку, которая превращает слово в обратное по действию.
       — Догадался,— обрадовался Алеша,— таких приставой в английском языке может быть только три — NO, UN, DIS. Попробуем каждую из них и узнаем, что подходит в данном случае.
       Алеше не повезло, и удача выпала только на третий раз.

  +---------------
  !  .DISMOUNT LD2:<ВК>
  !  -
  !  .DISMOUNT LD4:<ВК>
  !  -
  !

       — И так нужно делать для всех логических дисков?— спрашивает Алеша.
       — Если ты помнишь номера,— отвечаю я,— то можно только для тех, которые использовал. В противном случае придется освободить все логические диски, но ведь их всего только восемь. А это совсем немного. Зато теперь ты можешь загрузиться без проблем.

 

8.5. Типовой набор операций с файлом

       Работа с файлами имеет некоторый типовой набор операций. Мы уже заметили, что не все команды COPY обслуживает программа PIP. В каждом конкретном случае решение об этом принимает KMON. Когда же власть в руки берет пользователь, он должен определить, с чем он хочет работать. Если он хочет изменить структуру каталога — добавить или переставить записи, записать информацию в начальные блоки тома,— то пользователь должен выбрать программу DUP.
       Если мы перемещаем файл в системе или изменяем некоторые поля в записи о файле (не перемещая ее в каталоге), то должны запустить программу PIP.
       Оставим в стороне каталог и начальные блоки тома и займемся только файлом. Что мы можем сделать с файлом как с объектом, содержащим информацию. По всей видимости только одно — сделать его копию, т.е. скопировать информацию из одного файла в другой. Мы не будем сейчас говорить о преобразовании информации, потому что это особая большая тема. Мы также не можем уничтожить информацию в прямом смысле этого слова. Мы можем заменить одну информацию другой, которая для нас сейчас имеет значение. С этой командой COPY мы уже сталкивались, и здесь разберем только ее особенности.
       В RT-11 (как и во многих других системах) имеются устройства, которые могут быть для удобства пользователя выделены по своим возможностям копирования с одного устройства на другое.
       Первое устройство, которое всегда известно системе, — это системная консоль или системный терминал (а в персональных компьютерах он единственный). Конечно, мы можем дать обычную команду

  +---------------
  !  .COPY DX0:V5USER.TXT TT:
  !  -
  !

       и получить желаемый результат. Однако вспомним, что подключалось в давние времена в качестве системной консоли — TELETYPE — устройства фирмы TELETYPE CORPORATION, (шт.Иллинойс, США). Слово это означает "печатать на расстоянии". Под этими устройствами в те времена понимались обычные телеграфные аппараты, которые в усовершенствованном виде и до сих пор используются в крупных учреждениях как телетайпы. Но так как системный терминал находился близко от машины, то приставку TELE можно убрать, и мы получим новую команду:

  +---------------
  !  .TYPE DX0:V5USER.TXT
  !

       которая по результату полностью соответствует предыдущей.
       Кроме того, практически в каждой системе используется печатающее устройство. Чем оно отличается от терминала? Если мы вернемся к русско-английскому словарю, то найдем, что для слова ПЕЧАТАТЬ есть два значения — TYPE и PRINT. С чем это связано?
       Слово TYPE имеет главное значение — тип. В ПЕЧАТАТЬ оно превратилось с изобретением пишущей машинки. Писать типовыми знаками на пишущей машинке. А так как литерные рычаги ударяют по бумаге, то слово TYPE имеет значение ПЕЧАТАТЬ ТИПОВЫМИ ЗНАКАМИ НА ПИШУЩЕЙ МАШИНКЕ.
       Слово PRINT произошло от другого вида человеческой деятельности — печатать книги — и имеет главное значение — отпечаток, оттиск. Вычислительная техника для вывода информации требовала более быстродействующие печатающие устройства, чем пишущие машинки. Фирма IBM, которая была пионером в данном области, начала использовать печатающие барабаны, которые состояли из дисков с полным набором литер. Строка, по существу, печаталась за один удар. Поэтому такие устройства были названы принтерами. Как ты уже догадался, что команду

       COPY DX0:V5USER.TXT LP:

можно заменить на

       PRINT DX0:V5USER.TXT

       Таким образом, эти две дополнительные команды применяются только для удобства пользователя и в сущности представляют из себя команду COPY. Однако команды TYPE и PRINT по умолчанию знают тип файла .LST, чего не знает команда COPY. С помощью программы PIP эти команды выполняются одинаково:

  +---------------
  !  .RUN SY:PIP<ВК>
  !  -
  !  *LP:=DX0:V5USER.TXT<ВК>
  !  -

или

  +---------------
  !  .RUN SY:PIP<ВК>
  !  -
  !  *TT:=DX0:V5USER.TXT<ВК>
  !  -

       Другой вид операций, которые мы можем проделать с файлами, точнее с записью о файле, — это переименовать его. Или если говорить по-английски, то можно записать

   RENAME DX0:SAMLE.KED DX0:EXEMIN.K52

       синтаксис этой команды нам привычен. Поэтому ясно, что сначала записывается старое имя и тип файла, а затем новое имя файла. Это также можно выполнить с помощью программы PIP без посредников, используя однобуквенный ключ — /R.

  +---------------
  !  .RUN SY:PIP<ВК>
  !  -
  !  *DX0:EXEMIN.K52=DX0:SAMPLE.KED/R<ВК>
  !  -
  !  *^C^C
  !  -
  !  .^


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

           SIGN     - признаки состояния файла
           NAME.TYP - имя и тип файла
           SIZE     - размер файла
           STATUS   - состояние файла для системы
           DATE     - дата создания файла

       И если мы можем изменить имя и тип файла, то почему мы не можем изменить другие поля записи о файле.
       Основной признак состояния, благодаря которому мы можем работать с файлом,— "ПОСТОЯННЫЙ". Если мы изменим этот признак на "НЕИСПОЛЬЗУЕМЫЙ", то мы как бы удалим этот файл. Имя для такой команды найти нетрудно. В русско-английском словаре мы найдем несколько слов, обозначающих это понятие: MOVE OFF, REMOVE, DELETE, ERASE. Какое из этих слов выбрать?
       MOVE OFF — означает переслать куда-то.
       REMOVE — удалить вдаль, удаленный в смысле на расстояние. Хотя это слово и используется в операционных системах, но по смыслу оно не соответствует тому, о чем мы говорим.
       DELETE — произошло от латинского DELE, означающего корректорский знак выброски, указывающий на вычеркивание символа или части текста, который изображается, как почтовый конверт. Поэтому DELETE — это вычеркивать текст (или вымарывать).
       ERASE — слово тоже писательское и означает стирать, затирать резинкой.
       Трудно придумать способ затирать информацию в записи о файле или в самом файле, однако именно это слово используется для выполнения данной операции в операционной системе CP/M фирмы Digital Research.
       После использования команды

       DELETE VM:K52.SAV

       которую мы применяли в предыдущей главе, был виден след этого файла в распечатке каталога удаленных файлов. Т.е. как бы вычеркнули файл, но так, чтобы его можно было увидеть. В любом случае разработчики RT-11 фирмы DEC очень точно отразили в названии команды смысл того, что она делает. Основной ключ для выполнения этой операции программой PIP будет /D.

  +---------------
  !  .RUN SY:PIP<ВК>
  !  -

! *VM:K52.SAV/D<ВК> ! - ! *^C^C ! - ! .^

       В первых версиях системы нужно было при выполнении групповой операции удаления явно указывать ключ /Q (QUERY). Но в версии 5.0 и далее при выполнении удаления файлов система будет задавать вопрос во всех случаях, когда не указана явно полная спецификация файла. Т.е. если задана групповая спецификация и подразумевается список файлов, подлежащих удалению, то нужно будет подтверждать выполнение операции для каждого из них.
       Такой подход, кроме помощи забывчивым, дает и дополнительные удобства. Ключ /SYSTEM теперь не нужен, если задана полная спецификация файла.
       Изменить признак состояния файла "ЗАЩИЩЕННЫЙ" на "НЕЗАЩИЩЕННЫЙ", или попросту снять защиту, мы уже пробовали командой UNPROTECT. А для того чтобы защитить файлы, достаточно дать команду

  +---------------
  !  .PROTECT DX:.SAV<ВК>
  !  -
  !  . . . . . .
  !  . . . . . .
  !  .^

и дело будет сделано.
       Признак состояния файла "ЗАЩИЩЕННЫЙ" появился в версии 4.0, в которой команд PROTECT/UNPROTECT еще не было. Но так как изменение признака является переименованием, то делалось это следующим образом.

  +---------------
  !  .RENAME/PROTECT DX:.SAV DX:.SAV<ВК>
  !  -
  !  . . . . .
  !  . . . . .
  !  .^

       А с помощью программы PIP эти команды выполняются одинаковым образом:

  +---------------
  !  .RUN SY:PIP<ВК>
  !  -
  !  *DX0:.SAV=DX0:.SAV/R/F<ВК>
  !  -
  !  *^C^C
  !  -
  !  .^

для установки защиты от удаления, или

  +---------------
  !  .RUN SY:PIP<ВК>
  !  -
  !  *DX0:.SAV=DX0:.SAV/R/Z<ВК>
  !  -
  !  *^C^C
  !  -
  !  .^

для снятия защиты от удаления.
       Этот типовой набор команд имеет естественно и общий набор ключей. Их наличие или отсутствие в конкретной команде диктуется логикой выполнения команды. Команда COPY имеет самый большой набор ключей, который включает в себя почти все ключи, используемые в типовом наборе команд. Поэтому начнем с команды COPY.

 

8.6. Выбор исходных данных

       Вспомним, как мы работали с программой DIR. Для облегчения работы мы распечатывали каталог с указанной датой, до или после указанной даты. Можно просто выбрать новые файлы. Мы уже умеем создавать файлы (или хотя бы записи о них), а система считает новыми файлы, у которых дата создания совпадает с текущей датой системы.
       И раз уж наши потребности при работе с программой PIP и DIR совпадают, то, наверное, это общий набор ключей, и он нам уже известен.

           BEFORE[:DD:MMM:YY]  - до указанной даты
           DATE[:DD:MMM:YY]    - с указанной датой
           NEWFILES            - с текущей системной датой
           SINCE[:DD:MMM:YY]   - после указанной даты

       Однако, копируя файл, мы можем воздействовать на запись в каталоге о нем. И если мы можем выбрать файлы по указанной дате, то, наверное, мы можем при копировании установить новую дату для выходного файла. Русско-английский словарь подскажет нам составное слово для ключа. Устанавливать — SET, дата — DATE. И ключ будет /SETDATE[:DD:MMM:YY]. А если дату опустить, то система установит текущую системную дату.
       Эти ключи действительны для всех перечисленных команд, однако понятно, что ключ /SETDATE не может быть применен с командами DELETE, PRINT и TYPE.
       Команда DELETE вычеркивает запись из каталога, поэтому ничего не может установить. Команды PRINT и TYPE копируют файлы на устройство, которые не имеют каталога.
       Однако, раз мы сразу указываем и однобуквенные ключи CSI, то и для этой группы укажем ключи, которые нужно применять с программой PIP.

           /BEFORE[:DD:MMM:YY]  - /J:DD:MMM:YY
           /DATE[:DD:MMM:YY]    - /C:DD:MMM:YY
           /NEWFILES            - /C
           /SINCE[:DD:MMM:YY]   - /I:DD:MMM:YY
           /SETDATE[:DD:MMM:YY] - /T:DD:MMM:YY

 

8.7. Какие файлы мы копируем

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

   COPY DX0:(FILE1+FILE2).TXT DX1:BIGFIL.TWO

       появился только начиная с версии 4.0. А как же было до этого? Если мы стали пользоваться языком математики, то вспомним, что такая операция соединения или объединения называется конкатенацией. Что и дает другую форму этой команды.

   COPY/CONCATENATE DX0:FILE1.TXT,DX0:FILE2.TXT DX1:BIGFIL.TWO

       Правда наиболее часто ключ /CONCATENATE используется с групповой спецификацией, когда нужно большую группу файлов (как правило, имеющую общий признак) "слить" в один большой общий файл. Например, так:

   COPY/CONCATENATE LD0:1GL%%.DOC MT0:BOOK1V.DOC

       При этом следует учесть, что файлы будут копироваться в порядке, указанном в каталоге, а также то, что выходной файл не может иметь групповую спецификацию.
       Однако не все так просто. Конечно, если мы соединяем копируемые файлы, невзирая на их наполнение, то проблем не будет. Мы как бы отображаем один входной файл на выходной, а затем встык к нему (по границе блоков) отображаем второй входной файл. И так как система нам ничего не говорит, то, скорее всего действует ключ по умолчанию, который называется /IMAGE — образ.
       А как быть с текстовыми файлами? В третьей главе мы получали два маленьких текстовых файла — DX0FIL.DIR и DXFILE.DIR. Если их также скопировать вместе, то между их текстовой частью (в конце второго блока) получится дырка из нулевых кодов. Чтобы это увидеть, скопируем эти файлы

  +---------------
  !  .COPY DX:(DX0FIL+DXFILE).DIR DX0:TWOFIL.TXT<ВК>
  !  -
  !

и сразу посмотрим каталог.

  +---------------
  !  .DIR/FU/BL/VOL DX0:<ВК>
  !  -
  !
   14-Aug-89
   Volume ID: RT11SJ V5.00
   Owner    : АРХАНГЕЛСКИЙ
  SWAP  .SYS  26P 13-Jan-84    8      RT11SJ.SYS  73P 10-Mar-84   34
  TT    .SYS   2P 10-Mar-84  107      DX    .SYS   3P 10-Mar-84  109
  SL    .SYS  13P 10-Mar-84  112      LP    .SYS   2P 10-Mar-84  125
  MX    .SYS  10P 10-Mar-84  127      NL    .SYS   2P 10-Mar-84  137
  RK    .SYS   3P 10-Mar-84  139      MT    .SYS   9P 10-Mar-84  142
  DP    .SYS   3P 10-Mar-84  151      LD    .SYS   8P 10-Mar-84  154
  PIP   .SAV  29  06-Feb-84  162      DUP   .SAV  45  06-Feb-84  191
  DIR   .SAV  19  06-Feb-84  236      DUMP  .SAV   9  06-Feb-84  255
  DX0FIL.DIR   2  08-Aug-89  264      DXFILE.DIR   2  08-Aug-89  266
  TWOFIL.TXT   4  14-Aug-89  268      < UNUSED > 222             272
   19 Files, 264 Blocks

222 Free blocks

       А дырку по стыку можно увидеть, используя дамп объединенного файла.

  +---------------
  !  .DUMP/TERMINAL DX:TWOFIL.TXT<ВК>
  !  -
  !
 
  DX0:TWOFIL.TXT
  BLOCK NUMBER  000000
  000/ 031040 026 . . . 70 005015 053523 050101 * 26-Jul-86..SWAP*
  020/ 020040 051 . . . 40 033062 020120 031461 *  .SYS    26P 13*
  040/ 045055 067 . . . 40 020040 051040 030524 *-Jan-84      RT1*
  060/ 051461 027 . . . 40 033440 050063 030440 *1SJ.SYS    73P 1*
  100/ 026460 060 . . . 15 052124 020040 020040 *0-Mar-84..TT    *
  120/ 051456 051 . . . 40 020120 030061 046455 *.SYS     2P 10-M*
  140/ 071141 034 . . . 40 042040 020130 020040 *ar-84      DX   *
  160/ 027040 054 . . . 40 050063 030440 026460 * .SYS     3P 10-*
  200/ 060515 026 . . . 23 020040 020040 051456 *Mar-84..SL    .S*
  220/ 051531 020 . . . 20 030061 046455 071141 *YS    13P 10-Mar*
  240/ 034055 020 . . . 40 020120 020040 027040 *-84      LP    .*
  260/ 054523 020 . . . 62 030440 026460 060515 *SYS     2P 10-Ma*
  300/ 026562 032 . . . 40 020040 051456 051531 *r-84..MX    .SYS*
  320/ 020040 020 . . . 61 046455 071141 034055 *    10P 10-Mar-8*
  340/ 020064 020 . . . 14 020040 027040 054523 *4      NL    .SY*
  360/ 020123 020 . . . 40 026460 060515 026562 *S     2P 10-Mar-*
  400/ 032070 005 . . . 40 051456 051531 020040 *84..RK    .SYS  *
  420/ 020040 031 . . . 55 071141 034055 020064 *   3P 10-Mar-84 *
  440/ 020040 020 . . . 40 027040 054523 020123 *     MT    .SYS *
  460/ 020040 020 . . . 60 060515 026562 032070 *    9P 10-Mar-84*
  500/ 005015 050 . . . 56 051531 020040 020040 *..DP    .SYS    *
  520/ 031440 020 . . . 41 034055 020064 020040 * 3P 10-Mar-84   *
  540/ 020040 046 . . . 40 054523 020123 020040 *   LD    .SYS   *
  560/ 020040 050 . . . 15 026562 032070 005015 *  8P 10-Mar-84..*
  600/ 044520 020 . . . 01 020040 020040 034462 *PIP   .SAV    29*
  620/ 020040 033 . . . 55 020064 020040 020040 *  06-Feb-84     *
  640/ 042040 050 . . . 23 020126 020040 032040 * DUP   .SAV    4*
  660/ 020065 030 . . . 42 032070 005015 044504 *5  06-Feb-84..DI*
  700/ 020122 020 . . . 40 020040 034461 020040 *R   .SAV    19  *
  720/ 033060 043 . . . 64 020040 020040 042040 *06-Feb-84      D*
  740/ 046525 020 . . . 26 020040 020040 020071 *UMP  .SAV     9 *
  760/ 030040 026 . . . 70 005015 030440 020066 * 06-Feb-84.. 16 *
 
  BLOCK NUMBER  000001
  000/ 064506 062 . . . 65 041040 067554 065543 *Files, 256 Block*
  020/ 006563 020 . . . 06 062545 061040 067554 *s.. 230 Free blo*
  040/ 065543 006 . . . 00 000000 000000 000000 *cks.............*
  060/ 000000 000 . . . 00 000000 000000 000000 *................*
  100/ 000000 000 . . . 00 000000 000000 000000 *................*
  120/ 000000 000 . . . 00 000000 000000 000000 *................*
  140/ 000000 000 . . . 00 000000 000000 000000 *................*
  160/ 000000 000 . . . 00 000000 000000 000000 *................*
  200/ 000000 000 . . . 00 000000 000000 000000 *................*
  220/ 000000 000 . . . 00 000000 000000 000000 *................*
  240/ 000000 000 . . . 00 000000 000000 000000 *................*
  260/ 000000 000 . . . 00 000000 000000 000000 *................*
  300/ 000000 000 . . . 00 000000 000000 000000 *................*
  320/ 000000 000 . . . 00 000000 000000 000000 *................*
  340/ 000000 000 . . . 00 000000 000000 000000 *................*
  360/ 000000 000 . . . 00 000000 000000 000000 *................*
  400/ 000000 000 . . . 00 000000 000000 000000 *................*
  420/ 000000 000 . . . 00 000000 000000 000000 *................*
  440/ 000000 000 . . . 00 000000 000000 000000 *................*
  460/ 000000 000 . . . 00 000000 000000 000000 *................*
  500/ 000000 000 . . . 00 000000 000000 000000 *................*
  520/ 000000 000 . . . 00 000000 000000 000000 *................*
  540/ 000000 000 . . . 00 000000 000000 000000 *................*
  560/ 000000 000 . . . 00 000000 000000 000000 *................*
  600/ 000000 000 . . . 00 000000 000000 000000 *................*
  620/ 000000 000 . . . 00 000000 000000 000000 *................*
  640/ 000000 000 . . . 00 000000 000000 000000 *................*
  660/ 000000 000 . . . 00 000000 000000 000000 *................*
  700/ 000000 000 . . . 00 000000 000000 000000 *................*
  720/ 000000 000 . . . 00 000000 000000 000000 *................*
  740/ 000000 000 . . . 00 000000 000000 000000 *................*
  760/ 000000 000 . . . 00 000000 000000 000000 *................*
 
  BLOCK NUMBER  000002
  000/ 031040 026 . . . 70 005015 053523 050101 * 26-Jul-86..SWAP*
  020/ 020040 051 . . . 40 033062 020120 031461 *  .SYS    26P 13*
  040/ 045055 067 . . . 40 020040 051040 030524 *-Jan-84      RT1*
  060/ 051461 027 . . . 40 033440 050063 030440 *1SJ.SYS    73P 1*
  100/ 026460 060 . . . 15 052124 020040 020040 *0-Mar-84..TT    *
  120/ 051456 051 . . . 40 020120 030061 046455 *.SYS     2P 10-M*
  140/ 071141 034 . . . 40 042040 020130 020040 *ar-84      DX   *
  160/ 027040 054 . . . 40 050063 030440 026460 * .SYS     3P 10-*
  200/ 060515 026 . . . 23 020040 020040 051456 *Mar-84..SL    .S*
  220/ 051531 020 . . . 20 030061 046455 071141 *YS    13P 10-Mar*
  240/ 034055 020 . . . 40 020120 020040 027040 *-84      LP    .*
  260/ 054523 020 . . . 62 030440 026460 060515 *SYS     2P 10-Ma*
  300/ 026562 032 . . . 40 020040 051456 051531 *r-84..MX    .SYS*
  320/ 020040 020 . . . 61 046455 071141 034055 *    10P 10-Mar-8*
  340/ 020064 020 . . . 14 020040 027040 054523 *4      NL    .SY*
  360/ 020123 020 . . . 40 026460 060515 026562 *S     2P 10-Mar-*
  400/ 032070 005 . . . 40 051456 051531 020040 *84..RK    .SYS  *
  420/ 020040 031 . . . 55 071141 034055 020064 *   3P 10-Mar-84 *
  440/ 020040 020 . . . 40 027040 054523 020123 *     MT    .SYS *
  460/ 020040 020 . . . 60 060515 026562 032070 *    9P 10-Mar-84*
  500/ 005015 050 . . . 56 051531 020040 020040 *..DP    .SYS    *
  520/ 031440 020 . . . 41 034055 020064 020040 * 3P 10-Mar-84   *
  540/ 020040 046 . . . 40 054523 020123 020040 *   LD    .SYS   *
  560/ 020040 050 . . . 15 026562 032070 005015 *  8P 10-Mar-84..*
  600/ 044520 020 . . . 01 020040 020040 034462 *PIP   .SAV    29*
  620/ 020040 033 . . . 55 020064 020040 020040 *  06-Feb-84     *
  640/ 042040 050 . . . 23 020126 020040 032040 * DUP   .SAV    4*
  660/ 020065 030 . . . 42 032070 005015 044504 *5  06-Feb-84..DI*
  700/ 020122 020 . . . 40 020040 034461 020040 *R   .SAV    19  *
  720/ 033060 043 . . . 64 020040 020040 042040 *06-Feb-84      D*
  740/ 046525 020 . . . 26 020040 020040 020071 *UMP  .SAV     9 *
  760/ 030040 026 . . . 70 005015 054104 043060 * 06-Feb-84..DX0F*
 
  BLOCK NUMBER  000003
  000/ 046111 042 . . . 40 031040 020040 020040 *IL.DIR     2    *
  020/ 020040 020 . . . 40 020040 006440 020012 *             .. *
  040/ 033461 043 . . . 54 032462 020070 066102 *17 Files, 258 Bl*
  060/ 061557 071 . . . 62 043040 062562 020145 *ocks.. 228 Free *
  100/ 066142 061 . . . 00 000000 000000 000000 *blocks..........*
  120/ 000000 000 . . . 00 000000 000000 000000 *................*
  140/ 000000 000 . . . 00 000000 000000 000000 *................*
  160/ 000000 000 . . . 00 000000 000000 000000 *................*
  200/ 000000 000 . . . 00 000000 000000 000000 *................*
  220/ 000000 000 . . . 00 000000 000000 000000 *................*
  240/ 000000 000 . . . 00 000000 000000 000000 *................*
  260/ 000000 000 . . . 00 000000 000000 000000 *................*
  300/ 000000 000 . . . 00 000000 000000 000000 *................*
  320/ 000000 000 . . . 00 000000 000000 000000 *................*
  340/ 000000 000 . . . 00 000000 000000 000000 *................*
  360/ 000000 000 . . . 00 000000 000000 000000 *................*
  400/ 000000 000 . . . 00 000000 000000 000000 *................*
  420/ 000000 000 . . . 00 000000 000000 000000 *................*
  440/ 000000 000 . . . 00 000000 000000 000000 *................*
  460/ 000000 000 . . . 00 000000 000000 000000 *................*
  500/ 000000 000 . . . 00 000000 000000 000000 *................*
  520/ 000000 000 . . . 00 000000 000000 000000 *................*
  540/ 000000 000 . . . 00 000000 000000 000000 *................*
  560/ 000000 000 . . . 00 000000 000000 000000 *................*
  600/ 000000 000 . . . 00 000000 000000 000000 *................*
  620/ 000000 000 . . . 00 000000 000000 000000 *................*
  640/ 000000 000 . . . 00 000000 000000 000000 *................*
  660/ 000000 000 . . . 00 000000 000000 000000 *................*
  700/ 000000 000 . . . 00 000000 000000 000000 *................*
  720/ 000000 000 . . . 00 000000 000000 000000 *................*
  740/ 000000 000 . . . 00 000000 000000 000000 *................*
  760/ 000000 000 . . . 00 000000 000000 000000 *................*

       Наверное, чтобы этой дырки не было нужно сказать системе, что мы копируем файлы в коде ASCII и поэтому коды с нулевым значением нужно при чтении игнорировать.

  +---------------
  !  .COPY/ASCII DX1:(DX0FIL+DXFILE).DIR DX1:TWODIR.TXT<ВК>
  !  -
  !  .^

       И сразу посмотреть каталог:

  +---------------
  !  .DIR/FU/BL/VOL DX1:<ВК>
  !  -
  !
 
   14-Aug-89
   Volume ID: RT11SJ V5.00
   Owner    : АРХАНГЕЛСКИЙ
  SWAP  .SYS  26P 13-Jan-84    8      RT11SJ.SYS  73P 10-Mar-84   34
  TT    .SYS   2P 10-Mar-84  107      DX    .SYS   3P 10-Mar-84  109
  SL    .SYS  13P 10-Mar-84  112      LP    .SYS   2P 10-Mar-84  125
  MX    .SYS  10P 10-Mar-84  127      NL    .SYS   2P 10-Mar-84  137
  RK    .SYS   3P 10-Mar-84  139      MT    .SYS   9P 10-Mar-84  142
  DP    .SYS   3P 10-Mar-84  151      LD    .SYS   8P 10-Mar-84  154
  PIP   .SAV  29  06-Feb-84  162      DUP   .SAV  45  06-Feb-84  191
  DIR   .SAV  19  06-Feb-84  236      DUMP  .SAV   9  06-Feb-84  255
  DX0FIL.DIR   2  08-Aug-89  264      DXFILE.DIR   2  08-Aug-89  266
  TWOFIL.TXT   4  14-Aug-89  268      TWODIR.TXT   3  14-Aug-89  272
  < UNUSED > 219             275
   20 Files, 267 Blocks
   219 Free blocks

и дамп этого файла в месте стыка

  +---------------
  !  .DUMP/TERMINAL DX:TWODIR.TXT<ВК>
  !  -
  !
 
  DX0:TWODIR.TXT
  BLOCK NUMBER  000000
  000/ 031040 026 . . . 70 005015 053523 050101 * 26-Jul-86..SWAP*
  020/ 020040 051 . . . 40 033062 020120 031461 *  .SYS    26P 13*
  040/ 045055 067 . . . 40 020040 051040 030524 *-Jan-84      RT1*
  060/ 051461 027 . . . 40 033440 050063 030440 *1SJ.SYS    73P 1*
  100/ 026460 060 . . . 15 052124 020040 020040 *0-Mar-84..TT    *
  120/ 051456 051 . . . 40 020120 030061 046455 *.SYS     2P 10-M*
  140/ 071141 034 . . . 40 042040 020130 020040 *ar-84      DX   *
  160/ 027040 054 . . . 40 050063 030440 026460 * .SYS     3P 10-*
  200/ 060515 026 . . . 23 020040 020040 051456 *Mar-84..SL    .S*
  220/ 051531 020 . . . 20 030061 046455 071141 *YS    13P 10-Mar*
  240/ 034055 020 . . . 40 020120 020040 027040 *-84      LP    .*
  260/ 054523 020 . . . 62 030440 026460 060515 *SYS     2P 10-Ma*
  300/ 026562 032 . . . 40 020040 051456 051531 *r-84..MX    .SYS*
  320/ 020040 020 . . . 61 046455 071141 034055 *    10P 10-Mar-8*
  340/ 020064 020 . . . 14 020040 027040 054523 *4      NL    .SY*
  360/ 020123 020 . . . 40 026460 060515 026562 *S     2P 10-Mar-*
  400/ 032070 005 . . . 40 051456 051531 020040 *84..RK    .SYS  *
  420/ 020040 031 . . . 55 071141 034055 020064 *   3P 10-Mar-84 *
  440/ 020040 020 . . . 40 027040 054523 020123 *     MT    .SYS *
  460/ 020040 020 . . . 60 060515 026562 032070 *    9P 10-Mar-84*
  500/ 005015 050 . . . 56 051531 020040 020040 *..DP    .SYS    *
  520/ 031440 020 . . . 41 034055 020064 020040 * 3P 10-Mar-84   *
  540/ 020040 046 . . . 40 054523 020123 020040 *   LD    .SYS   *
  560/ 020040 050 . . . 15 026562 032070 005015 *  8P 10-Mar-84..*
  600/ 044520 020 . . . 01 020040 020040 034462 *PIP   .SAV    29*
  620/ 020040 033 . . . 55 020064 020040 020040 *  06-Feb-84     *
  640/ 042040 050 . . . 23 020126 020040 032040 * DUP   .SAV    4*
  660/ 020065 030 . . . 42 032070 005015 044504 *5  06-Feb-84..DI*
  700/ 020122 020 . . . 40 020040 034461 020040 *R   .SAV    19  *
  720/ 033060 043 . . . 64 020040 020040 042040 *06-Feb-84      D*
  740/ 046525 020 . . . 26 020040 020040 020071 *UMP  .SAV     9 *
  760/ 030040 026 . . . 70 005015 030440 020066 *06-Feb-84..  16 *
 
  BLOCK NUMBER  000001
  000/ 064506 062 . . . 65 041040 067554 065543 *Files, 256 Block*
  020/ 006563 020 . . . 06 062545 061040 067554 *s.. 230 Free blo*
  040/ 065543 006 . . . 55 066165 034055 006466 *cks.. 26-Jul-86.*
  060/ 051412 040 . . . 23 020123 020040 031040 *.SWAP  .SYS    2*
  100/ 050066 030 . . . 56 032070 020040 020040 *6P 13-Jan-84    *
  120/ 020040 052 . . . 56 051531 020040 020040 *  RT11SJ.SYS    *
  140/ 031467 020 . . . 41 034055 006464 052012 *73P 10-Mar-84..T*
  160/ 020124 020 . . . 23 020040 020040 050062 *T    .SYS     2P*
  200/ 030440 026 . . . 70 020040 020040 020040 * 10-Mar-84      *
  220/ 054104 020 . . . 31 020040 020040 031440 *DX    .SYS     3*
  240/ 020120 030 . . . 55 006464 051412 020114 *P 10-Mar-84..SL *
  260/ 020040 027 . . . 40 030440 050063 030440 *   .SYS    13P 1*
  300/ 026460 060 . . . 40 020040 020040 050114 *0-Mar-84      LP*
  320/ 020040 020 . . . 40 020040 031040 020120 *    .SYS     2P *
  340/ 030061 046 . . . 64 046412 020130 020040 *10-Mar-84..MX   *
  360/ 027040 054 . . . 40 050060 030440 026460 * .SYS    10P 10-*
  400/ 060515 026 . . . 40 020040 046116 020040 *Mar-84      NL  *
  420/ 020040 051 . . . 40 031040 020120 030061 *  .SYS     2P 10*
  440/ 046455 071 . . . 12 020113 020040 027040 *-Mar-84..RK    .*
  460/ 054523 020 . . . 63 030440 026460 060515 *SYS     3P 10-Ma*
  500/ 026562 032 . . . 40 052115 020040 020040 *r-84      MT    *
  520/ 051456 051 . . . 40 020120 030061 046455 *.SYS     9P 10-M*
  540/ 071141 034 . . . 20 020040 027040 054523 *ar-84..DP    .SY*
  560/ 020123 020 . . . 40 026460 060515 026562 *S     3P 10-Mar-*
  600/ 032070 020 . . . 14 020040 020040 051456 *84      LD    .S*
  620/ 051531 020 . . . 20 030061 046455 071141 *YS     8P 10-Mar*
  640/ 034055 006 . . . 40 027040 040523 020126 *-84..PIP   .SAV *
  660/ 020040 031 . . . 66 062506 026542 032070 *   29  06-Feb-84*
  700/ 020040 020 . . . 20 020040 051456 053101 *      DUP   .SAV*
  720/ 020040 020 . . . 60 043055 061145 034055 *    45  06-Feb-8*
  740/ 006464 042 . . . 40 040523 020126 020040 *4..DIR   .SAV   *
  760/ 030440 020 . . . 06 026542 032070 020040 * 19  06-Feb-84  *
 
  BLOCK NUMBER  000002
  000/ 020040 020 . . . 40 051456 053101 020040 *    DUMP  .SAV  *
  020/ 020040 034 . . . 55 061145 034055 006464 *   9  06-Feb-84.*
  040/ 042012 030 . . . 04 020122 020040 020040 *.DX0FIL.DIR     *
  060/ 020062 020 . . . 40 020040 020040 020040 *2               *
  100/ 020040 005 . . . 06 062554 026163 031040 *  .. 17 Files, 2*
  120/ 034065 041 . . . 63 020012 031062 020070 *58 Blocks.. 228 *
  140/ 071106 062 . . . 43 006563 000012 000000 *Free blocks.....*
  160/ 000000 000 . . . 00 000000 000000 000000 *................*
  200/ 000000 000 . . . 00 000000 000000 000000 *................*
  220/ 000000 000 . . . 00 000000 000000 000000 *................*
  240/ 000000 000 . . . 00 000000 000000 000000 *................*
  260/ 000000 000 . . . 00 000000 000000 000000 *................*
  300/ 000000 000 . . . 00 000000 000000 000000 *................*
  320/ 000000 000 . . . 00 000000 000000 000000 *................*
  340/ 000000 000 . . . 00 000000 000000 000000 *................*
  360/ 000000 000 . . . 00 000000 000000 000000 *................*
  400/ 000000 000 . . . 00 000000 000000 000000 *................*
  420/ 000000 000 . . . 00 000000 000000 000000 *................*
  440/ 000000 000 . . . 00 000000 000000 000000 *................*
  460/ 000000 000 . . . 00 000000 000000 000000 *................*
  500/ 000000 000 . . . 00 000000 000000 000000 *................*
  520/ 000000 000 . . . 00 000000 000000 000000 *................*
  540/ 000000 000 . . . 00 000000 000000 000000 *................*
  560/ 000000 000 . . . 00 000000 000000 000000 *................*
  600/ 000000 000 . . . 00 000000 000000 000000 *................*
  620/ 000000 000 . . . 00 000000 000000 000000 *................*
  640/ 000000 000 . . . 00 000000 000000 000000 *................*
  660/ 000000 000 . . . 00 000000 000000 000000 *................*
  700/ 000000 000 . . . 00 000000 000000 000000 *................*
  720/ 000000 000 . . . 00 000000 000000 000000 *................*
  740/ 000000 000 . . . 00 000000 000000 000000 *................*
  760/ 000000 000 . . . 00 000000 000000 000000 *................*

уже по каталогу видно, что полученный файл стал короче, а дамп показывает, что теперь это чистый текстовый файл.
       Однако, здесь нужно быть осторожным и помнить о свойствах кода ASCII. Раз код состоит из 7 бит, то программа PIP будет обнулять (для надежности) восьмой бит. Кроме того, символ CTRL/Z принят в системе в качестве признака конца текста и если он встретится случайно в середине текста, то он будет указывать на конец файла.
       Здесь можно также вспомнить файлы, записанные в специальном двоичном формате фирмы DEC, которые, как правило, имеют тип .OBJ или .LDA. Эти файлы отличаются тем, что их кусочки различной длины имеют в своем составе специальные контрольные коды, позволяющие проверить правильность соответствующего куска файла. Система поддерживает и это исключительное свойство, для чего нужно указать ключ /BINARY. В случае несовпадения контрольного кода программа PIP выдаст об этом сообщение.
       Понятно, что набор ключей, определяющий типы информации в файле, может быть применен только с командой COPY. Команды PRINT и TYPE сами знают, что работают с кодом ASCII, а остальные команды при всем желании не смогут использовать эту информацию.
       Эту группу однобуквенных ключей CSI для программы PIP мы также приведем:

           /CONCATENATE   - /U
           /ASCII         - /A
           /IMAGE         - --
           /BINARY        - /B

 

8.8. Доверяй, но проверяй

       Конечно, система с помощью признаков состояния от драйверов и каких-то других способов следит за правильностью выполненной операции копирования, но нам тоже хочется вмешаться в это действо.
       Во-первых, мы хотим, чтобы при копировании система дополнительно проверяла каждую записанную порцию информации. Сделать это несложно. Слово /VERIFY нам уже знакомо, но нужно помнить, что этот ключ появился только в версии 5.0. Идея проверки простая. При копировании каждой порции информации система после записи на выходное устройство читает только что записанную информацию и сравнивает с той, что хранится в памяти, в буфере программы PIP. Если при сравнении ошибок не найдено, то копирование продолжается.
       При его использовании нужно помнить, каким образом устройство внешней памяти записывает информацию. Например, для магнитной ленты его использование приведет только к лишнему дерганию ленты и мало поможет качеству записи. При использовании накопителей на магнитных дисках НГМД-6022 с драйверами MX он может даже ввести в заблуждение. Ведь эти накопители записывают целиком дорожку, а проверять мы будем только последний блок. В результате последней записи может возникнуть ошибка в первом блоке (дорожки), которую программа PIP пропустит. Оптимальными устройствами для копирования с этим ключем являются те, которые записывают информацию блоками или его частями, такие, как RK:, DX:, DP:, DZ:, и им подобные.
       Проверка — это хорошо, но если ошибка возникла в текстовом файле. А текст сам по себе несет избыточную информацию. Как бы проигнорировать ошибки чтения входного файла и тем самым спасти хотя бы то, что от него осталось. Ключ для этого мы уже сказали — /IGNORE. Добавим только, что он не может ужиться рядом с ключем /VERIFY, поэтому применять их вместе нельзя.
       Если мы уж сказали ключ IGNORE, то встретившаяся ошибка во входном файле не будет вызывать прекращение копирования. Вместо этого встретится сообщение об ошибке:

   ?PIP-W-Input file error

и копирование будет продолжаться. Более того, если на одном месте файла будет выдано только одно такое сообщение, то это означает, что системе удалось все-таки прочитать этот блок.
       Программа PIP копирует файлы достаточно большими кусками, как правило, по три блока или больше. И тут возникает вопрос — если возникнет ошибка, то не будет скопирован весь большой кусок. Тут даже ключ IGNORE не поможет. Дело в том, что при применении ключа /IGNORE и копировании с магнитной ленты в случае ошибки программа PIP запишет на выходное устройство содержимое буфера столько раз, сколько попыток чтения входного файла потребуется. Таким образом, выходной файл будет больше входного на количество плохо прочитанных блоков. Поэтому хотелось бы копировать файл по одному блоку, несмотря на то что это будет заметно медленнее. Скорее всего, английское слово SLOWLY — медленно — и будет подходить для этого ключа.
       Сочетание ключей /SLOWLY/VERIFY очень эффективно при копировании на накопителях с поблочной организацией, таких, как DX:, RK:, DP:, DZ: и им подобных. А сочетание /SLOWLY/IGNORE позволяет терять минимум информации при копировании с ошибками.
       И, конечно же, эти ключи имеют свои однобуквенные аналоги в программе PIP.

         /VERIFY     -  /H
         /IGNORE     -  /G
         /SLOWLY     -  /S

 

8.9. Шило на мыло

       Копирование файлов позволяет нам перенести информацию с одного диска на другой. Но при этом на входном томе останутся те же файлы. А если мы копировали файлы для того, чтобы собрать какую-то группу файлов вместе и при этом освободить место на входном томе? Тогда при копировании нам придется удалять уже скопированные файлы с входного тома. То, что это неудобно, — полбеды. Главное, что при большом количестве файлов можно допустить ошибку и удалить не тот файл, который копировали. Вот если бы можно было переслать файл, например, командой MOVE или хотя бы совместить команды COPY и DELETE. А если попробовать так:

  +---------------
  !  .COPY/DELETE DX0:DX0FIL DX1:<ВК>
  !  -
  !        Files copied/deleted
  !        --------------------
  !  DX0:DX0FIL.DIR to DX1:DX0FIL.DIR
  !  .^

       Мы уже привыкли, что в RT-11 все продумано и логично. Поэтому неудивительно, что наши пожелания так легко выполняются. Стоит отметить, что при выполнении этой команды удаление файла происходит только в случае успешного копирования на выходной том.
       А если на нашем выходном томе уже имеется файл с таким же именем и типом? Тогда система по умолчанию использует знакомый нам ключ /REPLACE — заменить, т.е. после успешного копирования файл, который первоначально был на томе, удаляется, а скопированный получает признак состояния "ПОСТОЯННЫЙ".
       Вот тут систему можно остановить за руку. Если у нас каталог большой, то мы могли просто забыть, что дали такое же имя другому файлу. Поэтому во избежание потери, отменим умолчание, сказав COPY/NOREPLACE. И тогда при копировании система будет сообщать о файлах с таким же именем и типом, имеющихся на выходном томе, но копировать их не будет.
       Все эти хорошие способности системы нам помогают в случае, если на выходном томе достаточно места, чтобы разместить очередной файл. Так бывает не всегда, и часто необходимо предварительно удалить файл с таким же именем и типом, чтобы на его место скопировать новый. Команда COPY/PREDELETE (предварительно удалить) особенно полезна на малых конфигурациях систем, таких, как, например, ДВК.
       Теперь можно оглянуться на другие команды. Наверное, с командой PRINT и TYPE также можно использовать ключ /DELETE, что позволит не задумываться над тем, какие страницы книги распечатали, а какие нет.
       А при переименовании может оказаться, что файл с указанным именем и типом уже существует. Поэтому ключи /REPLACE и /NOREPLACE также применимы с командой RENAME.
       Конечно, если мы загрузим программу PIP, то нам придется давать однобуквенные аналоги этих ключей из таблицы, приведенной ниже.

          /DELETE     - /D
          /REPLACE    - --
          /NOREPLACE  - /N
          /PREDELETE  - /O

 

8.10. Печать многих копий

       Несмотря на то что команды PRINT и TYPE являются аналогами команды COPY, они имеют особенность, связанную с размножением текста на принтере. Если нам нужно получить много бумажных копий одного и того же документа, об этом нужно просто сказать системе с помощью ключа /COPIES:NN и в качестве аргумента указать количество копий (десятичное) от 1 до 32. Сделать это нетрудно. Например:

  +---------------
  !  .PRINT/COPIES:3 SY:V5USER.TXT<ВК>
  !  -
  !  .^

и мы получили на бумаге три красивые картинки, которые видели при загрузке системы. Этот полезный ключ программа PIP понимает в его однобуквенном эквиваленте /K:NN.

 

8.11. Заключение.
или
Некоторые подробности

       Заканчивая наши разговоры о копировании файлов, отметим, что программа PIP также позволяет копировать на однодисковых системах, хотя это и утомительно при больших объемах или большом числе файлов. Ключ /WAIT в этом случае превращается в /E.
       И в качестве справочной таблицы приведем возможные сокращения команд и имена программ, которые их выполняют.

        COPY                 COP                - PIP
        TYPE                 TY                 - PIP
        DELETE               DEL                - PIP
        PROTECT              PRO                - PIP
        UNPROTECT            UNPR               - PIP
        PRINT                PRI                - PIP
        RENAME               REN                - PIP
        BOOT                 BO                 - DUP
        COPY/BOOT            COP/BO             - DUP
        COPY/DEVICE          COP/DEV            - DUP
        SQUEEZE              SQ                 - DUP
        INITIALIZE           INI                - DUP

       И также приведем сокращения ключей и их аналоги CSI в различных программах.

(c) 1992г Архангельский Андрей Германович




Поддержите культуру
ЯндексЯндекс. ДеньгиХочу такую же кнопку

Google
 
Web azdesign.ru az-libr.ru


Дата последнего изменения:
Wednesday, 06-Nov-2013 08:33:58 UTC