
- •2.1. Введение
- •2.2. Вопросы, относящиеся к команде who
- •2.2.1. Программы состоят из команд
- •2.3. Вопрос 1: Что делает команда who?
- •2.3.1. Обращение к справочнику
- •2.4. Вопрос 2: Как работает команда who?
- •2.4.1. Мы теперь знаем, как работает who
- •2.5. Вопрос 3: Могу ли я написать who?
- •2.5.1. Вопрос: Как я буду читать структуры из файла?
- •2.5.2. Ответ: Использование open, read и close
- •2.5.3. Написание программы who 1.С
- •2.5.4. Отображение записей о вхождениях в систему
- •2.5.5. Написание версии who2.С
- •2.6. Проект два: Разработка программы ср (чтение и запись)
- •2.6.1. Вопрос 1: Что делает команда ср?
- •2.6.2. Вопрос 2: Как команда ср создает файл и как пишет в него? Создание/транкатенация файла
- •2.6.3. Вопрос 3: Могу ли я написать программу ср?
- •2.6.4. Программирование в Unix кажется достаточно простым
- •2.7. Увеличение эффективности файловых операций ввода/ вывода: Буферирование
- •2.7.1. Какой размер буфера следует считать лучшим?
- •2.7.2 Почему на системные вызовы требуется тратить время?
- •2.7.3. Означает ли, что наша программа who2.С неэффективна?
- •2.7.4. Добавление буферирования к программе who2.С
- •2.8. Буферизация и ядро
- •2.8.1. Если буферизация столь хороша, то почему ее не использует ядро?
- •2.9. Чтение файла и запись в файл
- •2.9.1. Выход из системы: Что происходит?
- •2.9.2. Выход из системы: Как это происходит
- •2.9.3. Смещение текущего указателя: Iseek
- •2.9.4. Кодирование выхода из системы через терминал
- •2.10. Что делать с ошибками системных вызовов?
- •3.1. Введение
- •3.2. Вопрос 1: Что делает команда is?
- •3.2.1. Команда Is выводит список имен файлов и оповещает об атрибутах файлов
- •3.2.3. Наиболее употребимые опции
- •3.2.4. Первый ответ: Итоговые замечания
- •3.3. Краткий обзор дерева файловой системы
- •3.4. Вопрос 2: Как работает команда Is?
- •3.4.1. Что же такое каталог, в конце концов?
- •3.4.2. Работают ли системные вызовы open, read и close в отношении каталогов?
- •3.4.3. Хорошо, хорошо. Но как же мне прочитать каталог?
- •3.5. Вопрос 3: Могу ли я написать Is?
- •3.5.1. Что еще нужно делать?
- •3.6. Проект 2: Написание версии Is -I
- •3.6.1. Вопрос 1: Что делает Is-I?
- •3.6.2. Вопрос 2: Какработает Is -I?
- •3.6.3. Ответ: Системный вызов stat получает информацию о файле
- •3.6.4. Какую еще информацию можно получить с помощью системного вызова stat?
- •3.6.5. Чего мы достигли?
- •3.6.6. Преобразование числового значения поля mode в символьное значение
- •3.6.7. Преобразования числового представления идентификаторов собственника/группы в строковое представление
- •3.6.8. Объединение всего вместе: Is2.C
- •3.7. Три специальных разряда
- •3.7.1. Разряд Set-User-id
- •3.7.2Разряд Set-Group-id
- •3.7.3 Разряд Sticky Bit
- •3.7.4. Специальные разряды nls-l
- •3.8. Итоги для команды is
- •3.9. Установка и модификация свойств файла
- •3.9.1. Тип файла
- •3.9.2. Разряды прав доступа и специальные разряды
- •3.9.3. Число ссылок на файл
- •3.9.4. Собственник и группа для файла
- •3.9.5. Размер файла
- •3.9.6. Время последней модификации и доступа
- •3.9.7. Имя файла
2.4. Вопрос 2: Как работает команда who?
Нами было установлено, что команда who отображает информацию о тех пользователях, которые к текущему моменту вошли в систему. На странице документации для команды who дано описание того, что может делать эта команда и каким образом заставить ее выполнить допустимое для нее действие. Как работает команда who? Как она выполняет допустимые для нее действия?
Можно предположить, что системные программы, подобные who, используют специальные системные функции. В том числе, возможно, они включают расширенные привилегии администратора. Вам может потребоваться получить доступ к средствам системного разработчика, включая доступ к CD-ROM, толстым книгам и секретным кодам. Все это может потребовать каких-то расходов.
Вся документация о функционировании команды who находится в самой системе. Вам только нужно знать, где следует искать документацию.
Изучение Unix из Unix
Вы можете изучать принципы работы любой команды, используя для этого четыре возможности:
• Чтение справочника.
• Поиск в справочнике.
• Чтение файлов с именами, имеющими расширение .h.
• Использование ссылок из секции see also.
Мы будем далее использовать эти возможности для изучения команды who.
Чтение из справочника
Для изучения команды who следует набрать
$ man who
и обратиться к секции DESCRIPTION. В справочнике для SunOS текст этой секции будет иметь такой вид:
DESCRIPTION
The who utility can list the user's name, terminal line,
login time, elapsed time since activity occurred on the
line, and the process-ID of the command interpreter (shell)
for each current UNIX system user. It examines the
/Var/adm/utmp file to obtain its information. If file is
given, that file (which must be in utmp(4) format) is exam-ined.
Usually, file will be /Var/admAvtmp, which contains a
history of all the logins since the file was last created.
Из данного документа мы получаем полную информацию о команде. Команда who проверяет файл /var/adm/utmp для извлечения для себя из него необходимой информации. Из текста описания следует, что список текущих пользователей хранится в этом файле. Команда читает файл. Что нам следует знать об этом файле? Для этого мы можем обратиться к справочнику и найти необходимую информацию.
Поиск в справочнике
Команда man допускает возможность обращения к справочнику для организации поиска по ключевым словам. Для организации поиска следует использовать опцию -к. Чтобы получить информацию о 'utmp', следует выполнить:
$ man -k utmp |
|
|
endutent |
getutent (3c) |
-access utmp file entry |
endutxent |
getutxent (3c) |
-access utmpx file entry |
getutent |
getutent (3c) |
-access utmp file entry |
getutid |
getutent (3c) |
-access utmp file entry |
getutline |
getutent (3c) |
-access utmp file entry |
getutmp |
getutxent (3c) |
-access utmpx file entry |
getutmpx |
getutxent (3c) |
-access utmpx file entry |
getutxent |
getutxent (3c) |
-access utmpx file entry |
getutxid |
getutxent (3c) |
-access utmpx file^fltfy~~ |
getutxline |
getutxent (3c) |
-access utmpx file entry |
pututline |
getutent (3c) |
-access utmp file entry |
pututxline |
getutxent (3c) |
-access utmpx file entry |
setutent |
getutent (3c) |
-access utmp file entry |
setutxent |
getutxent (3c) |
-access utmpx file entry |
ttyslot |
ttyslot (3c) |
. -find the slot in the utmp file of the current user |
updwtmp |
getutxent (3c) |
-access utmpx file entry |
updwtmpx |
getutxent (3c) |
-access utmpx file entry |
utmp |
utmp (4) |
utmp and wtmp entry formats |
utmp2wtmp |
acct(1m) |
overview of accounting and miscellaneous accounting commands |
utmpd |
utmpd (1m) |
-utmp and utmpx monitoring daemon |
utmpname |
getutent (3c) |
-access utmp file entry |
utmpx |
utmpx (4) |
utmpx and wtmpx entry formats |
utmpxname |
getutxent (3c) |
-access utmpx file entry |
wtmp |
utmp (4) |
utmp and wtmp entry formats |
wtmpx |
utmpx (4) |
utmpx and wtmpx entry formats |
$
Полученный результат работы команды был получен на SunOS. Такой вывод будет пред-
. ставлен в аналогичном виде и на других инсталляциях. Каждая строка в этом выводе
содержит тему, название страницы справочника и краткое описание. Те строки, которые
помечены метками utmp и wtmp, возможно, представляют то, что нам необходимо. Другие
(записи с похожими метками могут нам понадобиться позже.
Нотация utmp (4) означает, что документация по utmp находится в разделе 4 справочника. Этот номер раздела следует использовать при обращении к команде man:
$ man 4 utmp
utmp(4j utmp(4)
NAME
utmp, wtmp - Login records
SYNOPSIS
#include <utmp.h>
DESCRIPTION
The utmp file records information about who is currently using the
system.
The file is a sequence of utmp entries, as defined in struct utmp in the
utmp.h file.
The utmp structure gives the name of the special file associated with
the user's terminal, the user's login name, and the time of the login
in the form of time(3). The ut_type field is the type of entry, which
can specify several symbolic constant values. The symbolic constants
are defined in the utmp.h file.
The wtmp file records all logins and logouts. A null user name
indicates a logout on the associated terminal. A terminal referenced
with a tilde (-) indicates that the system was rebooted at the
indicated time. The adjacent pair of entries with terminal names
referenced by a vertical bar (|) or a right brace (}) indicate the
system-maintained time just before and just after a dale command has
changed the system's time frame.
The wtmp file is maintained by login( 1) and init(8). Neither of these
pro-grams creates the file, so, if it is removed, record keeping is
turned off. See ac(8) for information on the file. ^—^
FILES
/usr/include/utmp.h
/Var/adm/utmp more
(88%)
Мы достаточно быстро ответили на вопрос, как работает команда who. На первой странице документации по команде who сказано, что команда читает файл utmp. Здесь сказано, что файл utmp представляет собой последовательность записей utmp, которые определены в структуре utmp в файле utmp.h. Где же находится этот файл utmp.h?
Нам повезло. В разделе FILES на странице документации есть нужная информация. Там указано маршрутное имя файла /usr/include/utmp.h.
Прежде чем перейти к рассмотрению следующей возможности для работы со справочником (чтение файлов с расширением имен .1)), обратимся еще к некоторой информации на данной странице документации. Речь идет о файле wtmp, куда происходит запись обо всех входах в систему и выходах из системы. Для работы с файлом указаны ссылки на команды login(l), init(8) и ас(8). Их рассмотрение будет интересно при изучении тем, которые будут представлены позже.
Изучение Unix по справочнику аналогично поиску информации о каком-то объекте в Web. По мере чтения различных страниц справочника вы находите дополнительные ссылки, с помощью которых можете обратиться к интересующим вас и полезным для вас темам. Именно так, в соответствии с нашими задачами, мы подошли к изучению файла <utmp.h>.
Чтение файлов .h
В документации по utmp сказано, что структура записей в файле utmp описана в файле /usr/include/utmp.h. В большинстве Unix - машин заголовочные файлы для системной информации хранятся в каталоге, который называется /usr/include. Когда С - компилятор обнаруживает в тексте программы строку вида:
#include <stdio.h>
он предполагает, что этот файл находится в каталоге /usr/include. Используем команду more для прочтения содержимого этого файла:
$ more /usr/include/utmp.h
…
«define UTMP_FILE "/var/adm/utmp"
#define WTMP_FILE "/var/adm/Wtmp"
#include <sys/types.h> /* for pid t, time t */
*/
* Структуры файлов utmp и wtmp.
*
**
#define ut_name ut_user /* совместимость */
struct utmp {
char ut_user[32]; /* Пользовательское входное имя */
char utjd[14];
/* /etc/inittab id- IDENT_LEN в
char ut_line[32]; /* имя устройства (console, Inxx) */
short ut_type; /* тип записи */
pid_t ut_pid;
struct exit_status { I* идентификатор процесса */ struct exitstatus {
short ejermination; /* статус окончания процесса */
short e_exit; /* статус процесса при выполнении exit */
} ut_exit; /* Статус exit процесса, помеченного как
* DEAD PROCESS.
timej utjime; /* временная отметка о сделанной записи */
char ut_host[64]; /* имя хоста, такое же как
* MAXHOSTNAMELEN */
};
/* Определения для ut.type */
utmp.h (60%)
В начале в данном выводе пропущен ряд сообщений и другой вводный материал. Далее мы обнаруживаем определение структуры. Оказывается, записи о вхождениях в систему состоят из восьми элементов. Поле ut_user предназначено для хранения пользовательского имени. В массиве ut_line помещается информация об устройстве, что в данном случае будет означать терминал, через который пользователь соединен с системой. Через несколько строк в структуре представлено поле ut_time, где хранится время вхождения в систему, а поле ut_host предназначено для хранения имени удаленного компьютере.
В рассматриваемой структуре есть еще и другие элементы. Они напрямую не используются для отображения информации командой who, но могут быть полезными в других ситуациях.
Структура записи utmp на вашей системе может отличаться от рассмотренной. Но файл ut-mp.h на вашей системе будет описывать формат данных utmp для вашей системы. Имена полей обычно одинаковы для различных версий Unix, но наличие поля, которое имеет комментарий "совместимость", показывает, что они иногда могут и отличаться. Заголовочные файлы обычно снабжены хорошими комментариями, которые содержат полезную информацию.