- •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. Имя файла
3.9.7. Имя файла
Когда вы создаете файл, вы присваиваете ему имя. С помощью команды mv можно I изменять имя файла. Кроме того, команда mv может перемещать файл из одного каталога
в другой.
Установление имени файла. Системный вызов creat устанавливает имя и начальный
режим для файла.
Изменение имени файла. Системный вызов rename изменяет имя файла. При обращении к вызову задаются два аргумента, старое и новое имя:
rename |
|
НАЗНАЧЕНИЕ |
Изменение имени и/или перемещение файла |
INCLUDE |
#include < stdio.h > |
ИСПОЛЬЗОВАНИЕ АРГУМЕНТЫ |
int result = rename(char *old, char "new) old - старое имя файла или каталога new - новое маршрутное имя для файла или каталога |
КОДЫ ВОЗВРАТА |
-1 -при ошибке 0 - при успехе |
Заключение
Основные идеи
• На диске находятся каталоги и файлы. Файлы имеют содержимое и свойства. В файле могут содержаться данные некоторого типа. Каталог может содержать только список имен файлов.
• Имена в каталогах соотнесены файлам и другим каталогам. В ядре есть системные вызовы для чтения содержимого каталогов, для чтения свойств (атрибутов) файлов и для модификации большинства атрибутов файлов.
• Тип файла, права доступа и три специальных атрибута хранятся как двоичный код некоторого целого числа. Для выборки определенных разрядов используется техника поразрядного маскирования.
• Собственник и группа файла хранятся в числовом представлении. Соответствие между этими числами и символьными именами собственника и группы устанавливается через базы данных passwd и group.
Что дальше?
Каталог - это список файлов и каталогов. Каталоги связаны между собой в древовидную структуру. Как происходит работа с этим деревом? Как связываются между собой каталоги? В следующей главе мы рассмотрим внутреннюю структуру дерева.
Визуальнй итог
Исследования
3.1 Длина d_name[ ]. В определении структуры struct dirent длина символьного массива И d_name[ ] была указана равной J для некоторых систем и может быть 255 символов I для других систем. Какова будет фактическая длина? Почему приведены такие странные числа? Почему не использована нотация вида:, char *?
Защита файлов от самого себя. Режим доступа вида:-------rwx, который вы можете установить с помощью команды chmod 007 filename, вполне допустим, но явно весь-В ма эксцентричен. Он гарантирует все остальным пользователям право на чтение, запись и исполнение в отношении файла filename, но не предоставляет таких прав ни собственнику, ни группе. Установите такой режим для некоторого файла. Смогли ли вы прочитать такой файл? Поэкспериментируйте с различными комбинациями, чтобы представить себе логику ядра, которая используется при определении прав доступа при работе системного вызова open. Если у вас есть возможность доступа к исходным
кодам ядра, найдите ту часть кода, которая отвечает за права доступа, и проверьте -правильны ли ваши догадки относительно логики работы.
3.3 Идентификаторы и пользовательские имена. Каждый пользователь имеет пользовательское имя и каждому имени сопоставлен пользовательский числовой идентификатор. Возможен ли случай, когда двум различным пользовательским именам сопоставлен один и тот же числовой идентификатор пользователя? Возможен ли случай, когда одному и тому же пользовательскому имени сопоставлены два различных числовых идентификатора пользователя? Если у вас есть права доступа root на машине, то попробуйте поэкспериментировать с различными комбинациями. Заведите учетные записи на двух различных пользователей, для которых укажите один и тот же UID, но для каждого пользователя должны быть установлены свое пользовательское имя и свой пароль. Могут ли каждый из пользователей модифицировать файлы у другого? Что должна показать при выводе команда who? Что покажет команда Is -I? Что покажет команда id? А как быть с электронной почтой? Что дал вам эксперимент для понимания того, как работают эти команды?
Можете ли придумать ситуации, где было бы полезным использовать множество пользовательских имен при одном и том же пользовательском идентификаторе?
3.4 Специальные разряды и каталоги. Каталоги, как и все файлы в Unix, имеют полный набор разрядов для определения прав доступа, включая разряды set-user-ID, set-group-ID. Возникает вот какая задача. Если вы установите в отношении каталога разряд set-group-ID, то повлияет ли он на работу с каталогом? Если да, то как и почему? Если нет, то подумайте, как можно будет использовать этот разряд?
3.5 Исполнимый код и права на исполнение. У каждого файла есть три разряда для установки права на исполнения для собственника, группы и для всех остальных пользователей. Вы можете установить право на исполнение для любого файла, для обыкновенных текстовых файлов, даже для тех, которые содержат перечень товаров в продовольственном магазине. Но, с другой стороны, может быть файл, который содержит исполнимый код, например, a.out, и который получен после компиляции С-программы. Для этого файла может быть сброшен разряд на исполнение. Объясните разницу между идеями исполнимого кода и правами на исполнение для файла. Связаны ли эти идеи между собой? Почитайте документацию по команде file.
3.6 Входные имена и пользовательские ID. Каждый пользователь имеет символьное пользовательское имя и числовой идентификатор — UID. Зачем? Не было бы более простым указывать в качестве владельца файла символьное имя пользователя? Почему бы для каждого пользователя не завести только один числовой идентификатор? В чем проблемы с двумя системами идентификации? Какие преимущества предоставляют две системы идентификации? Если бы вы проектировали собственную операционную систему, то как бы вы поступили в отношении этого вопроса?
3.7 В документации на dirent, текст которой был приведен, была сделана ссылка на системный вызов getdents(2). Что делает этот вызов и какое отношение он имеет к readdir?
3.8 Обычно в листинге команды Is -I каталоги представлены с такими правами доступа: drwxr-xr-x.
При посимвольном разборе этого поля слева направо обнаруживаем: тип файла -каталог, собственник каталога может выполнять операции чтения, записи и исполнения в отношении каталога, члены группы и все остальные пользователи могут выполнять только операции чтения и исполнения в отношении каталога.
Что означает право на "исполнение" в отношении каталога? Файл может содержал код, составленный из команд конкретной машины, или код, составленный на "скриптовом" языке. Имеет смысл маркировать такой файл как "исполняемый", поскольку компьютер может непосредственно исполнять программу на машинном языке или запустить интерпретатор для исполнения скрипта. Каталог же - это просто список имен файлов, и он не может быть запущен на исполнение. Так что же означает разряд, дающий право на исполнение каталога? Почему он полезен? Поэкспериментируйте с командной chmod и выключите разряд на исполнение для каталога и посмотрите, что получится в данной ситуации.
3.9 Работа с вашим терминалом. Пользователи связываются с системой с помощью терминалов или терминальных эмуляционных программ. Каждый терминал представлен как файл в каталоге /dev. Выполните следующие команды: Is -1 /dev/tty* j more, В результате получим вывод списка всех терминальных устройств и их свойств. Файлы, которые представляют терминалы, как и обычные файлы, имеют собственника, Собственником терминала будет тот пользователь, который вошел в систему через этот терминал. Терминальные устройства не используют root в качестве собственника. Собственник терминала изменяется программой login. Обратитесь к исходному коду программы login и отыщите в ней код, где происходит изменение собственника. Что изменяет программа, когда собственность возвращается опять в root, когда вы будете выходить из системы?
