Linux программирование в примерах
Наконец, переменная
помогает реализовать опциюrflg, которая меняет порядок сортировки. Она инициализируется 1 (строка 30). Если-rиспользуется,-rустанавливается в -1 (строки 89–91).rflgСледующий псевдокод описывает логику
; номера строк на левой границе соответствуют номерам строкcompar():ls.c407 if <i>ls должна прочесть каталоги</i> # dflg == 0408 if <i>p1 аргумент командной строки и p1 каталог</i>409 if <i>p2 не аргумент командной строки и не каталог</i>410 return 1 # первый идет после второгоelse<i>перейти на тест времени</i>411 else# p1 не каталог командной строки412 if <i>p2 аргумент командной строки и каталог</i>413 return -1 # первый идет перед вторымelse<i>перейти на тест времени</i>416 if <i>сортировка основана на времени</i> # tflg равно true# сравнить времена:417 if <i>время p2 равно времени p1</i>418 return 0419 if <i>время p2 > времени p1</i>420 return <i>значение rflg (положительное или отрицательное)</i># время p2 < времени p1421 return <i>противоположное rflg значение (положительное или отрицательное)</i>423 <i>Умножить rflg на результат strcmp()</i>424 <i>для двух имен и вернуть результат</i>Аргументы
в строках 423–424 выглядят сбивающими с толку. В зависимости от того, было ли имя файла указано в командной строке или было прочитано из каталога, должны использоваться различные члены объединенияstrcmp()вln.struct lbuf7.3. Резюме
• V7
является сравнительно небольшой программой, хотя она затрагивает многие фундаментальные аспекты программирования Unix — файловый ввод-вывод, вспомогательные данные файлов, содержание каталогов, пользователи и группы, значения времени и даты, сортировку и динамическое управление памятью.ls• Наиболее примечательным внешним различием между V7
и современнойlsявляется трактовка опцийlsи-а. У версии V7 значительно меньше опций, чем у современных версий; заметным недостатком является отсутствие рекурсивной опции-l.-R• Управление
является чистым способом использования ограниченной памяти архитектуры PDP-11, предоставляя в то же время как можно больше сведений,flistхорошо извлекает нужные сведения изstruct lbuf; это значительно упрощает код. Код для вывода девяти битов доступа компактен и элегантен.struct stat• Некоторые части
используют удивительно маленькие лимиты, такие, как верхняя граница числа файлов в 1024 или размер буфера вlsв 100.makename()Упражнения
1. Рассмотрите функцию
. Что случится, если запрошенный ID равен 256, а вgetname()есть следующие две строки, в этом порядке:/etc/passwdjoe:xyzzy:2160:10:Joe User:/usr/joe:/bin/shjane:zzyxx:216:12:Jane User:/usr/jane:/bin/sh2. Рассмотрите функцию
. Может ли она использоватьmakename()для составления имени? Почему может или почему нет?sprintf()3. Являются ли строки 319–320 в
действительно необходимыми?readdir()4. Возьмите программу
, которую вы написали в качестве упражнения в «Упражнениях» к главе 6. Добавьте функциюstatиз V7nblock()и выведите результаты вместе с полемlsизst_blocks. Добавьте видимый маркер, когда они различны.struct stat5. Как бы вы оценили V7
по ее использованиюls? (Подсказка: как часто вызываетсяmalloc()? Где ее следовало бы вызвать?)free()6. Как вы оценили бы ясность кода V7
? (Подсказка: сколько там комментариев?)ls7. Очертите шаги, которые нужно было бы сделать, чтобы адаптировать V7
для современных систем.lsГлава 8
Файловые системы и обходы каталогов
Данная глава завершает обсуждение файловых систем и каталогов Linux (и Unix). Сначала мы опишем, как к логическому пространству имен файловой системы добавляется (и удаляется) раздел диска, содержащий файловую систему, таким образом, что в общем пользователю не нужно ни знать, ни заботиться о месте физического размещения файла, вместе с API для работы с файловыми системами
Затем мы опишем, как перемещаться по иерархическому пространству имен файлов, как получать полный путь текущего рабочего каталога и как без труда обрабатывать произвольные иерархии (деревья) каталогов, используя функцию
. Наконец, мы опишем специализированный, но важный системный вызовnftw().chroot()8.1. Монтирование и демонтирование файловых систем
Унифицированное иерархическое пространство имен файлов является большим достоинством дизайна Linux/Unix. Данный раздел рассматривает, как административные файлы, команды и операционная система объединяются для построения пространства имен из отдельных физических устройств, содержащих данные и служебные данные файлов.
8.1.1. Обзор основ
В главе 5 «Каталоги и служебные данные файлов», были представлены индексы для служебных данных файлов и описано, как элементы каталогов связывают имена файлов с индексами В ней также были описаны разделы и файловые системы, и вы видели, что прямые ссылки ограничены работой в пределах одной файловой системы, поскольку каталоги содержат лишь номера индексов, а последние не уникальны среди всего набора использующихся файловых систем.