
- •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.6.2. Вопрос 2: Какработает Is -I?
I Как мы можем получить информацию о файле? Давайте обратимся к электронному спра-I вочнику. При таком обращении:
$ man -k file i grep -i information
должна быть найдена полезная информация о файле, но она по-разному называется в различных версиях Unix. Многие версии вместо термина информация о файле используютI термин статусная информация о файле, или свойства файла. Для извлечения статусной информации о файле используется системный вызов star.
3.6.3. Ответ: Системный вызов stat получает информацию о файле
На рисунке 3.3 изображено, как работает системный вызов stat.
Рисунок 3.3 Чтение статусной информации о файле с помощью stat
Файл хранится на диске. Файл имеет содержимое и набор атрибутов: размер, идентификатор собственника и т. д. Процессу необходимо получить статусную информацию о файле. Процесс должен определить место, куда будет помещена статусная информация о файле.
Поэтому он определяет буфер типа struct stat, а затем процесс обращается к ядру с требованием скопировать статусную информацию с диска в этот буфер.
stat |
|
НАЗНАЧЕНИЕ |
Получение статусной информации о файле |
INCLUDE |
«include < sys/stat.h > |
ИСПОЛЬЗОВАНИЕ |
int result = stat(char *fname, struct stat *bufp) |
АРГУМЕНТЫ |
fname - имя файла bufp - указатель на буфер |
КОДЫ ВОЗВРАТА |
-1-при ошибке 0 -при успехе |
Системный вызов stat копирует статусную информацию о файле с именем fname в струк-1 туру, на которую выставлен указатель bufp. В следующем ниже примере показывается, как I используется системный вызов stat для получения размера файла.
/* filesize.c - выводит размер файла passwd */
#include <stdio.h>
#include <sys/stat.h> i
nt main( )
{
struct stat infobuf; /* место хранения статусной информации */
if (stat("/etc/passwd", Sinfobuf) == -1) /* получить информацию */
perror('/etc/passwd");
printf(“ The size of/etc/passwd is %d\n", infobuf.stjize);
}
Системный вызов stat копирует статусную информацию о файле в структуру infobuf. после I чего программа читает размер файла из поля st_size в этой структуре.
3.6.4. Какую еще информацию можно получить с помощью системного вызова stat?
Документация для stat и заголовочный файл /usr/include/sys/stat.h представляют описание I перечня полей в структуре struct stat.
stjnode - тип и права доступа
st_uid - идентификатор собственника
st_gid - идентификатор группы
st.size - количество байтов в файле
stjiiink - число ссылок на файл
st_mtime - время последней модификации содержимого файла
st.atime - время последнего доступа
st_ctime - время последнего изменения статусной информации
В структуре содержатся еще и другие поля. Но именно указанные поля отображаются при I работе команды Is -I.
Следующая далее простая программа fileinfo.c извлекает и выводит эти атрибуты.
I* fileinfo.c - использует stat() для получения и вывода статусной
* информации о файле
*- некоторые поля просто содержат числа...
*/
#include <stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
int main(int ac, char*av[])
{
struct stat info; . /* буфер для статусной информации */
if (ac>1)
if(stat(av[1],&info)!=-1){
show_stat_info(av[1 ], &info);
return 0;
}
else
perror(av[1 ]); /* сообщения об ошибках stat()7
return 1;
}
show stat infofchar *fname, struct stat *buf)
/*
* отображение информации из stat в формате a name=value
*/
{
printf(" mode: %o\n", buf->st_mode); /* тип + доступ */
printf(" links: %d\n", buf->st_nlink); /* количество ссылок */
printff' user: %d\n", buf->st_uid); /* id пользователя */
printf(" group: %d\n", buf->st_gid); /* id группы */
printf(" size: %d\n", buf->st_size); /* размер файла */
printf("modtime: %d\n", buf->st_mtime); /* время модификации */
printf(" name: %s\n", fname); /* имя файла */
}
Откомпилируем и запустим на исполнение программу fileinfo, а затем сравним полученный вывод с выводом, который получается при работе стандартной версии Is -1:
$ сс -о fileinfo fileinfo.c
$./fileinfo fileinfo.c
mode: 100664
links: 1
user: 500
group: 120
size: 1106
modtime: 965158604
name: fileinfo.c
$ Is -I fileinfo.c
-rw-rw-r- 1 bruce users 1106 Aug 1 15:36 fileinfo.c
-----,-----.,-.,.н,иия