- •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.8. Буферизация и ядро
Буферизация - чрезвычайно полезная идея: читать данные в большие области памяти, которые находятся в вашем пространстве. Затем процесс выбирает из этих областей более мелкие части - те, которые ему необходимы.
2.8.1. Если буферизация столь хороша, то почему ее не использует ядро?
Использует. При переходе в режим ядра и при возврате из него затрачивается время, но на передачу данных между твердым диском требуется несравненно больше времени. Для экономии времени ядро хранит копии блоков с диска в памяти. На рисунке 2.7 это проиллюстрировано.
Рисунок 2.7
Буферизация дисковых данных в ядр
Диск представляет собой объединение блоков данных аналогично тому, как файл utmp представляет собой объединение записей о входах в систему. Буферы ядра содержат копии некоторых блоков диска, точно так же, как наши utmp буферы содержат копии utmp записей.
Ядро копирует блоки с диска в буферы ядра. Когда процессу становятся нужны данные из определенного файла, то ядро копирует данные из буфера ядра в буфер процесса. Ядро не копирует непосредственно с диска в пользовательское пространство памяти.
Что происходит, если обнаруживается, что требуемой части данных нет в буфере ядра? Ядро приостанавливает процесс, который к нему обратился, и выставляет заявку на требуемый блок в свой "список покупок". Ядро затем находит другие процессы, которые готовы к выполнению некой работы и позволяет этим процессам развиваться.
Через какое-то время ядро переместит требуемые данные с диска в буфер ядра. Теперь ядро может копировать данные в буфер пользовательского пространства, после чего разбудит спящий процесс.
Понимание принципов буферирования в ядре изменяет наше восприятие системных вызовов read и write. Системный вызов read копирует данные для процесса из буфера ядра, а системный вызов write копирует данные из процесса в буфер ядра. Передача данных между буферами ядра и диском происходит не так, как при работе системных вызовов read и write.
Ядро может копировать данные на диск всякий раз, когда возникает в этом потребность. Возникает ситуация, аналогичная тому, как вы складываете почтовые конверты на столе в прихожей, чтобы потом их сразу переслать по почте. В нашем случае данные, которые обозначены процессом для записи, накапливаются в буферах ядра, ожидая момента, когда ядро скопирует их на диск. Если в системе внезапно произойдет отказ, который не позволяет ядру скопировать блоки из буфера на диск, то изменения в файле или добавления данных в него произведены не будут.
Последствия буферизации в ядре:
• Более быстрый "дисковый " ввод/вывод. Оптимизированные записи на диск.
• Необходимость записи буферов на диск перед остановом системы.
2.9. Чтение файла и запись в файл
Наша первая программа who читала из файла. Наша вторая программа ср читала из одного файла и писала в другой файл. А есть ли программы, которые читают из файла и пишут в тот же файл?
2.9.1. Выход из системы: Что происходит?
Что происходит, когда вы выходите из системы? Прежде всего, в системе происходит изменение записи в файле utmp. По полученному результату работы whol можно было заметить, что в файле utmp могут содержаться записи для неиспользуемых терминальных линий. Поэкспериментируйте и попытайтесь выполнить следующее:
1. Войдите в систему дважды, используя для этого два окна telnet к одной машине.
2. Используйте программу whol, которую мы написали, чтобы посмотреть содержимое файла utmp. Посмотрите, какие терминальные линии используются.
3. Выполните однократный выход из ваших сессий.
4. Запустите повторно на исполнение whol, чтобы посмотреть, что произошло с нашими двумя utmp записями.
Вы увидите, что одна из записей, которая содержит ваше входное имя, изменилась. Обратите внимание, что изменилось значение поля utjime. Какое будет новое значение времени I в этом поле? На некоторых системах поле с входным именем очищается. Будут ли еще какие-то изменения в записи? Что произойдет с именем удаленной машины?
