просто эксперимент для того, чтобы увидеть, будут ли асинхронные собы-
тия производить вывод на экран синхронно. В данном случае это именно
так. Файл выводится командой more. Пока утилита more постранично выво-
дит файл, все ее команды нам доступны. (Наш командный файл m в главе 4
иллюстрирует, что мы можем делать с помощью more.)
В строке 63 выводится сообщение пользователю о том, что он должен
нажать возврат каретки. Строка 64 выполняет чтение. Эта последователь-
ность придерживает распечатанный файл данных на экране, чтобы его
строки не пропали при сдвиге вверх. Если бы этих операторов не было,
напечаталось бы главное меню и мы потеряли бы то, что находилось в
верхней части экрана.
Строка 66 выполняет проверку на ошибки для меню в целом. Если вы
ввели данные, которые не соответствуют ни одному из предыдущих шабло-
нов, то им сопоставляется шаблон *. В этом случае печатается сообщение
об ошибке, управление переходит из оператора case в конец цикла while
и при следующей итерации этого цикла снова печатается главное меню.


----------------------------------------------------------
ИМЯ: office
----------------------------------------------------------

office Делопроизводитель

    НАЗНАЧЕНИЕ



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

    ФОРМАТ ВЫЗОВА



office

    ПРИМЕР ВЫЗОВА



office Проверяет мой почтовый ящик и сообщает, пуст ли он
m

ТЕКСТ ПРОГРАММЫ office

1 :
2 # @(#) office v1.0 Office Manager Author: Russ Sage
2а Делопроизводитель

4 if [ $# -gt 0 ]
5 then echo "office: argument error" >&2
6 echo "usage: office" >&2
7 exit 1
8 fi

10 while :
11 do
12 c
13 set `date`
14 echo "
15 $1, $2 $3 $4

17 Office Menu
18 -----------
19 Mail
20 News
21 Calendar
22 Phone
23 Automatic Reminders
24 Shell Command
25 to exit

27 press m,n,c,p,a,s or : \c"

29 read CMD

31 case $CMD in
32 "") exit;;
33 m|M) if [ -s /usr/spool/mail/$LOGNAME ]
34 then echo
35 ll /usr/spool/mail/$LOGNAME
36 echo "\nWould yuo like to see it (
y/n): \c"
37 read CMD
38 if [ "$CMD" = "y" ]
39 then echo
40 mail
41 fi
42 else echo "\nNo mail today"
43 fi
44 echo "\nhit \c"
45 read CMD;;
46 n|N) PWD=`pwd`
47 cd /usr/news
48 echo "\nThe following files are news item
in /usr/news:\n"
49 lc
50 echo "\nEnter filename or to exit: \c"
51 read NAME
52 while [ "$NAME" != "" ]
53 do
54 if [ -s $NAME ]
55 then echo "\n-------------------"
56 cat $NAME
57 echo "---------------------"
58 else echo "$NAME is not a news
file"
59 fi
60 echo "\nEnter filename or to
exit: \c"
61 read NAME
62 done
63 cd $PWD;;
64 c|C) echo "\n"
65 today
66 if [ -s $HOME/calendar ]
67 then echo "Calendar file:\n`ll $HOME/
calendar`"
68 echo "\nCalendar notifications:"
69 PWD=`pwd`
70 cd $HOME
71 calendar
72 cd $PWD
73 echo "\nCheck your mail for calendar
notifications"
74 else echo "\nYou do not have a calendar
file at $HOME"
75 fi
76 echo "\nhit \c"
77 read CMD;;
78 p|P) phone;;
79 a|A) greet
80 $HB/at 11:45 echo ^GLunch in 15 minutes
81 $HB/at 16:45 echo ^GShift change in 15
minutes

83 echo "\nYou will receive notices at 11:45
& 4:45"
84 echo "\nWould you like to leave some
reminders (y/n): \c"
85 read CMD
86 if [ "$CMD" = "y" ]
87 then echo "\nThe syntax is: at HR:MN
executable_phrase"
88 echo "The time now : `date '+%T'`"
89 echo "\n\ncmd ( to exit): \c"
90 read CMD
91 while [ "$CMD" != "" ]
92 do
93 eval $CMD
94 echo "cmd ( to exit
): \c"
95 read CMD
96 done
97 fi;;
98 s|S) echo "\nenter command: \c"
99 read CMD
100 eval $CMD
101 echo "\nhit \c"
102 read CMD;;
103 *) echo "\nInvalid command"
104 echo "\nhit \c"
105 read CMD;;
106 esac
107 done

    ПЕРЕМЕННЫЕ СРЕДЫ ВЫПОЛНЕНИЯ



CMD Содержит различные команды на разных уровнях меню
HOME Еще одна экспортируемая переменная, взятая из
среды выполнения
LOGNAME Shell-переменная, предварительно экспортированная
NAME Содержит имя файла с новостями


ОПИСАНИЕ

ЗАЧЕМ НАМ НУЖЕН office?

Многие инструментальные средства в системе UNIX могут выполнять
полезные функции, относящиеся к делопроизводству. В силу способа орга-
низации UNIX, это отдельные и самостоятельные средства. Для того чтобы
узнать о них, необходимо найти все эти средства в справочных руко-
водствах, изучить каждое из них и все время помнить, как с ними рабо-
тать. Это очень неудобно.
Кроме, того, нам необходимо добавить ряд мощных команд к нашему
UNIX, включая несколько отдельных управляемых с помощью меню утилит.
Каким образом мы можем все это об'единить?
Нам необходим механизм, с помощью которого мы можем получить
доступ ко всем функциям, имеющим отношение к делопроизводству. Если
использовать меню, мы сможем вызывать каждую функцию нажатием одной
клавиши.

ЧТО ДЕЛАЕТ office?

Office представляет собой попытку собрать наиболее часто исполь-
зуемые функции делопроизводства в один пакет, управляемый с помощью
меню. Тем самым office упрощает вызов этих функций, поскольку вам не
обязательно знать, где эти утилиты размещаются и как к ним обращаться.
Если у вас есть помощник-секретарь без всякого опыта работы в системе
UNIX, вы можете поручить ему выполнение многих из этих функций. Вы мо-
жете добавить новые функции и уровни меню, если это необходимо.
В office имеются как неотъемлемые общие функции делопроизводства,
так и специфические добавки. Данная утилита пытается управлять как
основными функциями, так и кругом задач по вашему вкусу. К базовым
функциям относятся почта, новости, календарь и база телефонных номе-
ров. Добавляемые особенности включают в себя систему напоминаний,
основанную на утилите at, и возможность запуска еще одного командного
интерпретатора shell, не выходя из программы office. Благодаря всем
этим качествам, все находится в одном месте и обеспечивается простота
доступа и сопровождения.
Главное меню содержит все доступные функции. Оно выглядит так:

-----------------------
|
| Fri, Jun 20 16:18:23
|
| Office Menu
| -----------
| Mail (Почта)
| News (Новости)
| Calendar (Календарь)
| Phone (Телефоны)
| Automatic Reminders (Автоматические напоминания)
| Shell Command (Переход в shell)
| to exit (Выход)
|
| press m,n,c,p,a,s or :
|

День и дата в левом верхнем углу получены командой UNIX date.
Каждый раз при выводе меню печатается новое значение времени. Оно
сообщает вам о том, когда вы начали работать с этим меню, и как долго
вы работали.
Первым вариантом выбора является почта. Здесь ваш почтовый файл
проверяется на ненулевой размер. Если размер нулевой (или такой файл
отсутствует), выводится сообщение "no mail today" (сегодня почты нет).
Если для вас есть почта, то информация из файла почтового ящика распе-
чатывается в длинном формате командой ls и выводится запрос о том, хо-
тите ли вы прочитать вашу почту. Если вы сказали "yes" (да), выполня-
ется обычная команда UNIX mail.
Вторым вариантом выбора являются новости. Файлы новостей хранятся
в одном каталоге, где каждая порция новостей представляет собой неза-
висимый файл. Все порции новостей хранятся в специальном каталоге с
именем /usr/news. Office выводит список всех файлов новостей и затем
спрашивает, хотите ли вы просмотреть один из них. Если да, введите имя
файла - и он распечатается командой more. Мы предполагаем, что у вас
есть сетевая связь между пользователями или какое-то другое средство
для получения новостей.
Третий вариант выбора - календарь. Поскольку с календарем связана
разнообразная информация, данная опция подразделяется на различные
функции. Сначала выводится полностью календарь на текущий месяц с вы-
деленной сегодняшней датой. Это делается с помощью утилиты today,
рассмотренной ранее. Затем выполняется обращение к системной утилите
работы с календарем. Если в вашем регистрационном каталоге есть файл с
именем calendar, то утилита calendar (выполняемая командой cron для
просмотра каждого регистрационного каталога) просматривает записи ва-
шего календаря. Если какие-либо записи относятся к сегодняшнему или
завтрашнему дню, эта утилита посылает их вам по почте.
Командный файл office использует несколько иной подход. Сначала
ваш файл календаря проверяется на существование и ненулевой размер.
Если файл существует, то он выводится на экран в длинном формате, так
что вы можете увидеть сам файл и информацию, относящуюся к нему. После
этого выполняется функция calendar. При таком вызове на стандартное
устройство вывода печатаются все записи, подходящие по времени. Утили-
та calendar, вызываемая командой cron, обеспечивает связь только при
помощи почты. Если календарного файла нет, то выводится сообщение, ин-
формирующее об этом.
Следующим вариантом выбора являются телефоны. Для управления ба-
зой данных телефонных номеров используется утилита phone, рассмотрен-
ная в предыдущем разделе. Поскольку при вызове phone не выполняется
никакой предварительной или последующей обработки данных, вы можете
перечитать этот раздел, чтобы вспомнить, как работает эта утилита.
Пятый вариант выбора - автоматические напоминания. Эта опция
предназначена для того, чтобы помогать вам в слежении за важными мо-
ментами времени в течение дня. Первым делом она приветствует вас в ду-
хе утилиты greet. Затем запускаются в фоновом режиме два командных
файла at. Они срабатывают в 11:45 для объявления о ленче и в 16:45 для
объявления о конце рабочего дня. Если вы хотите запустить некоторые из
ваших собственных командных файлов в фоновом режиме выполнения, от-
ветьте "yes" (да) на следующий вопрос. Для напоминания выводится син-
таксис утитлиты at, печатается текущее время, и ожидается ваш ввод ко-
манд для at. Красиво и просто в применении! (Если в вашей системе име-
ется встроенная возможность at, а вы реализовали нашу версию at под
другим именем или в другом каталоге, проследите за соответствующими
изменениями в тексте командного файла.)
Благодаря способу выполнения введенной вами команды at, вы можете
ввести любую команду, но не саму at. Цикл сделан так, что он принимает
столько команд, сколько вам нужно. Для выхода из цикла введите возврат
каретки.
Последняя опция предназначена для выполнения любой желаемой ко-
манды вне программы office, оставаясь тем не менее в office. Вы даже
можете бы запустить еще один shell вне программы office (введя с кла-
виатуры sh), а затем по control-D вернуться в office. Нет почти ничего
невозможного.
Для выхода из office достаточно просто нажать возврат каретки.
Тем самым произойдет выход из бесконечного цикла и возврат к предыду-
щему shell.


    ПРИМЕРЫ



$ office
s
sh
$

Запуск office и выбор работы с shell. Затем запуск shell-команды
с именем sh, т.е. самого shell. При этом вы запускаете новый shell и
получаете его символ приглашения. По окончании работы с этим shell
введите ^d для выхода из него и возврата к главному меню утилиты
office.


    ПОЯСНЕНИЯ



Строки 4-8 выполняют проверку на ошибки. Если вы вызвали office с
какими-либо опциями, то вы создали ситуацию ошибки.
Строки 10-107 - это один большой цикл while. Его структура подоб-
на ранее рассмотренным утилитам, управляемым с помощью меню. Строка 12
очищает экран командой c (см. главу 7). Если вы не хотите читать с за-
беганием вперед и включать в текст эту команду, вы можете пока про-
пустить эту строку или, если у вас система BSD, использовать команду
clear. В строке 13 позиционным параметрам присваивается результат ко-
манды date.
Строки 14-27 выводят само меню, а строка 29 читает вводимую поль-
зователем команду. Строки 31-106 представляют собой оператор case, ко-
торый распознает введенную команду и выполняет соответствующие
действия.
Строка 32 выполняет выход из программы office, если был введен
только возврат каретки. Строки 33-45 управляют командой mail. Вначале
с помощью команды test проверяется, имеет ли файл с почтовыми сообще-
ниями размер больше нуля. Если да, выводится пустая строка и почтовый
файл печатается в длинном формате команды ls. Затем вам задается воп-
рос о том, хотите ли вы просмотреть почту. Еслы вы вводите "y", вызы-
вается команда mail. При любом другом вводе выполняется возврат в
главное меню.
Строки 46-63 обрабатывают команду новостей. Сначала переменная
PWD устанавливается на наш текущий рабочий каталог. Это делается для
того, чтобы при переходе командой cd в какое-то другое место, мы смог-
ли по окончании обработки вернуться туда, где мы начали работать. За-
тем по команде cd мы переходим в каталог /usr/news. Это каталог, в ко-
тором хранятся файлы новостей. В системе Berkeley доступен каталог
/usr/msgs. Этот каталог очень похож на /usr/news и может использо-
ваться вместо него, если у вас есть такое желание. Выводится в виде
столбцов список файлов из каталога /usr/news (строка 49), и вам зада-
ется вопрос о том, хотите ли вы посмотреть какие-нибудь из этих фай-
лов. Если вы вводите возврат каретки, команда test воспринимает это
как нулевой ввод и выполняется выход из оператора while.
Цикл while выполняется до тех пор, пока значение переменной NAME
не равно нулю (строка 52). Введенное имя проверяется на существование.
Если такой файл существует, то он распечатывается командой cat, обрам-
ленной строками из черточек. Если файл не существует, то выводится
сообщение о том, что такого файла новостей нет. Затем вас просят
ввести имя другого файла. Этот процесс продолжается в цикле, пока вы
не введете только возврат каретки. Когда вы выходите из цикла в строке
62, выполняется команда cd для возврата в тот каталог, откуда вы нача-
ли работать. Эта команда cd не оказывает никакого влияния после за-
пуска утилиты office. Вы должны указать команду cd вашему регистраци-
онному shell. Никакая другая программа, запущенная из порожденного
shell, не может выполнить для вас команду cd.
Строки 64-77 выполняют функции календаря. Сначала выводятся две
пустые строки. Почему две? Потому что обычно команда echo вставляет
символ новой строки в конце каждой выводимой строки, а выводимой в
данный момент строкой является еще один символ новой строки. Затем в
строке 65 запускается программа today. Она печатает изображение кален-
даря на месяц. Строка 66 проверяет, имеется ли календарный файл в ва-
шем регистрационном каталоге. Если да, он выводится в длинном формате
команды ls в строке 67. Печатается также сообщение-заголовок "Calendar
Notifications" (календарные извещения).
Строка 69 запоминает текущий рабочий каталог переменной PWD. За-
тем мы переходим командой cd в каталог $HOME, чтобы находиться в том
же каталоге, что и календарный файл. В строке 71 вызывается команда
UNIX calendar. Она просматривает календарный файл и выводит все подхо-
дящие по времени сообщения. По команде cd мы возвращаемся в наш исход-
ный каталог для того, чтобы восстановить порядок. Строка 73 выводит
сообщение, чтобы вы проверили вашу почту на наличие календарных за-
писей. Как указывалось ранее, команда calendar работает двумя способа-
ми.
Оператор else в строке 74 выводит вам сообщение, если у вас нет
календарного файла. По завершении оператора if, в строках 76 и 77 пе-
чатается сообщение о том, что нужно нажать возврат каретки, и выполня-
ется оператор read. Это блокирующее чтение, которое означает остановку
и ожидание какого-либо ввода. Это противоположность неблокирующему
чтению, или более широко известной технике чтения с опросом. Опрос
возможен в программах, написанных на Си, но запуск опроса в shell мо-
жет потребовать немного больших усилий. Для изучения чтения с опросом
ознакомьтесь с главой, описывающей терминальные устройства.
Строка 78 управляет командой phone. Она вызывает утилиту phone,
которую мы рассмотрели ранее, после чего управление передается в конец
цикла while. Печатается главное меню, и все начинается сначала.
Строки 79-97 управляют автоматическими напоминаниями. Сначала за-
пускается программа greet. Она была описана ранее в этой главе. Затем
в строках 80 и 81 в режиме фонового выполнения вызываются два команд-
ных файла at, которые выполнятся позже в течение дня. В строке 84 вам
задается вопрос, желаете ли вы оставить какие-то свои напоминания.
Если вы отвечаете "y", выполняются строки 87-96. Если вы не ввели "y",
оператор else не выполняется, поэтому управление передается главному
меню. Вы видите, что эта возможность предполагает однократное исполь-
зование в течение дня.
Строки 87-89 выводят некоторую информацию, необходимую для того,
чтобы вы завели для себя напоминания. Выводится синтаксис программы
at, текущая дата (только время) и затем приглашение вводить вашу ко-
манду. Строка 90 читает вашу команду. Строка 91 означает, что если был
введен не только возврат каретки, то нужно выполнить этот цикл. Поэто-
му цикл while продолжается, пока вы не нажмете только возврат каретки.
Строка 93 пытается выполнить команду, которую вы ввели. Команда eval
используется для того, чтобы раскрыть значения тех переменных, которые
могли быть не раскрыты ранее. Строка 94 просит ввести следующую коман-
ду, а строка 95 читает ее. Поскольку чтение стоит в самом конце цикла,
оператор while выполняет проверку нового ввода с клавиатуры.
Строки 98-102 управляют выходом в shell. Эта часть программы поч-
ти идентична циклу, использованному для напоминаний. Нам выдается
приглашение на ввод команды, она зачитывается в переменную, затем де-
лается синтаксический разбор этой переменной с помощью команды eval.
Если вы хотите перейти в shell, выполните команду sh - и она породит
shell. Строки 101 и 102 не дают появиться на экране главному меню до
тех пор, пока вы не нажмете возврат каретки.
Строки 103-105 выполняют проверку на ошибки ввода. Любая непра-
вильная команда попадает сюда. Выводится сообщение об ошибке и выда-
ется приглашение "hit " (нажмите возврат каретки).

    * ГЛАВА 6. УПРАВЛЕНИЕ ЛИЧНОЙ ИНФОРМАЦИЕЙ II: *




    ОСВЕДОМЛЕННОСТЬ ПОЛЬЗОВАТЕЛЯ


    И ЗАЩИТА ЛИЧНОЙ ИНФОРМАЦИИ





    ОСВЕДОМЛЕННОСТЬ ПОЛЬЗОВАТЕЛЯ



activ показать активность терминалов
info показать информацию о паролях пользователей
uchk посмотреть процессы других пользователей
watch наблюдать за регистрацией в системе
whox команда who с дополнительными возможностями


    ЗАЩИТА ЛИЧНОЙ ИНФОРМАЦИИ



acme показать учетную информацию
inuse запретить использование терминала
lock блокировать и разблокировать файлы



УПРАВЛЕНИЕ ЛИЧНОЙ ИНФОРМАЦИЕЙ II:

    ОСВЕДОМЛЕННОСТЬ ПОЛЬЗОВАТЕЛЯ


    И ЗАЩИТА ЛИЧНОЙ ИНФОРМАЦИИ




    ВВЕДЕНИЕ



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

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

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

Поэтому мы здесь представим две группы инструментальных средств.
Средства ОСВЕДОМЛЕННОСТИ ПОЛЬЗОВАТЕЛЯ помогают нам следить за тем, что
делают другие, и тем самым упростить связь с ними. Средства ЛИЧНОЙ ЗА-
ЩИТЫ важны для защиты нашей учетной информации и наших данных и для
получения информации о наших собственных действиях.

Первая группа рассматриваемых здесь средств, относится к "осве-
домленности пользователя". Этими средствами являются activ, info,
uchk, watch и whox.

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

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

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

Следующее средство - watch. Эта программа похожа на "демон", ко-
торый выполняется в фоновом режиме и постоянно следит за регистрацией
определенных пользователей. Когда нужное вам лицо регистрируется, на
ваш терминал посылается сообщение о том, что данный пользователь вошел
в систему. Таким образом, вы можете продолжать работу вместо того,
чтобы постоянно прерывать ее.

Последняя утилита в данном разделе - это whox. Whox дает вам
исчерпывающие сведения обо всех пользователях, зарегистрировавшихся на
машине. Вы можете получить информацию, похожую на результат команды
who, которая отсортирована различным образом, отобразить информацию о
терминалах или даже передать почтовое сообщение любому пользователю.



    ОСВЕДОМЛЕННОСТЬ ПОЛЬЗОВАТЕЛЯ



------------------------------------------------------------
ИМЯ: activ
-------------------------------------------------------------

activ Показывает активность терминалов

    НАЗНАЧЕНИЕ



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

    ФОРМАТ ВЫЗОВА



activ

    ПРИМЕР ВЫЗОВА



activ Выводит на экран информацию об активности
пользователей на своих терминалах

    ТЕКСТ ПРОГРАММЫ



1 :
2 # @(#) activ v1.0 Display terminal activity Author: Russ Sage
2а Показать активность терминалов

4 if [ $# -gt 0 ]
5 then echo "activ: argument error" >&2
6 echo "usage: activ" >&2
7 exit 1
8 fi

10 who -u | cut -c1-17,38-42

ОПИСАНИЕ

ЗАЧЕМ НАМ НУЖЕН КОМАНДНЫЙ ФАЙЛ activ?

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

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

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

ЧТО ДЕЛАЕТ activ?

Activ печатает информацию об активности всех пользователей систе-
мы. Распечатка содержит имя пользователя, номер терминала, на котором
он зарегистрировался, и время последнего обращения к клавиатуре. Если
клавиатура была использована в течение последней минуты, этот терминал
отмечается точкой. Если терминал не был использован в течение послед-
них 24 часов, напротив него печатается слово "old". Во всех остальных
случаях выводится время последнего использования терминала в минутах и
секундах. Вот пример такой распечатки:

------------------------
|
| root tty01 01:23
| sage tty05 .
| batch tty12 old
| nuucp tty16 .
|

Важным вопросом является то, как система узнает, когда кто-либо
работает с клавиатурой? Поскольку терминальные устройства являются
файлами, мы можем собрать информацию о терминале путем просмотра
состояния файла, связанного с ним. В данном случае искомая информация
- время последнего использования клавиатуры.

То, что мы ищем, уже есть в системе. Это опция -u команды who.
Эта опция, однако, существует только в системе AT&T UNIX System V, по-
этому команда activ, по крайней мере в представленном виде, может быть
реализована только в этой системе. Activ берет выход команды "who -u"
и "отрезает" некоторые данные, не имеющие отношения к нашей цели.

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

Таблица 6.1
Временные характеристики файла

--------------------------------------------------------------
Временные Системные вызовы, изменяющие временные
характеристики характеристики
--------------------------------------------------------------
Время доступа creat, mknod, pipe, utime, read
Время модификации creat, mknod, pipe, utime, write
Время создания creat, mknod, pipe, utime, write,
chmod, chown, link
--------------------------------------------------------------