Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
методичка ПО ОСРВ заочники.doc
Скачиваний:
0
Добавлен:
01.05.2025
Размер:
8.72 Mб
Скачать

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

-----,-----.,-.,.н,иия