
- •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.5. Вопрос 3: Могу ли я написать Is?
Логика получения содержимого каталога будет такой:
main()
opendir
while (readdir)
print d_name
closedir
Полный код программы Isl.c будет таким:
/"Isl.c
** цель - вывод списка содержимого каталога или каталогов
** при отсутствии аргументов используется., в противном случае
** используется список имен файлов через список аргументов
include <stdio.h>
#include <sys/types.h>
#include <dirent.h>
void do_ls(char fj);
main(int ac, char *av[ ])
{
if(ac==i)
do_ls.");
else
while (--ac){
printf("%s:\n", *++av);
do_ls(*av);
}
}
void do_ls(char dirname[ ])
/* list files in directory called dirname
*/
{
DIR "dir_ptr; /* каталог */
struct dirent 'direntp; /* каждая запись */
if ((dir_ptr = opendir(dirname)) == NULL)
fprintf(stderr,"ls1: cannot open %s\n", dirname);
else
while ((direntp = readdir(dir_ptr)) != NULL)
printf("%s\n", direntp->d_name);
closedir(dir_ptr);
}
}
Откомпилируем и запустим этот код, а затем сравним полученный результат с выводом команды Is, которая работает на вашей системе:
$ cc -о Is1 Isl.c
$ Is1
.
..
s.tar
tail1
Makefile
Isl.c
Is2.c
chap03
old.src
docs
Is1
statl .c
statdemo.c
tail1.c
$ ls
Makefile docs Isl.c old_src statl.с taiH
chap03 Is1 Is2.c s.tar statdemo.c tail 1.с
$
3.5.1. Что еще нужно делать?
Неплохо для первой попытки. Эта версия 1.0 Is выводит список файлов в каталоге, но в дан-I ной версии не поддерживаются следующие возможности:
(a) Нет сортировки вывода.
Наш список имен файлов не отсортирован в алфавитном порядке. Устранение. Мы можем считать все имена файлов в массив, а затем использовать команду qsort для сортировки этого массива.
(b) Нет поколонного вывода.
Стандартная версия команды Is поддерживает возможность вывода списка имен файлов поколонно. В некоторых версиях расположение имен поколонно происходит сверху вниз, слева направо, а в других системах - слева направо, сверху вниз.
(с) Вывод файлов с именами с лидирующей точкой.
В этой версии отображаются имена файлов с точкой. В стандартной версии команды Is имена файлов с лидирующей точкой отображаются, только если используется опция -а. [ Устранение: Подавить вывод имен с лидирующей точкой достаточно просто и обеспечить их вывод по опции -а.
(d) He работает опция -1.
В стандартной версии Is производится вывод статусной информации о файле, если пользователь задает при обращении к команде опцию -I. В нашем варианте такой возможностей нет. Устранение: Добавить отработку опции -1 непросто. В структуре dirent. которая определена в заголовочном файле <dirent.h>, есть только несколько необходимых элементов структуре dirent отсутствует информация о размере файла, о собственнике, а также данные о других характеристиках файла. Если этой информации нет в каталоге, то где же она хранится?