Чтение онлайн

ЖАНРЫ

Шрифт:

#include <sys/types.h>

#include <sys/stat.h>

int stat(const char *path, struct stat *buf);

int lstat (const char *path, struct stat *buf);

int fstat(int fildes, struct stat *buf);

В качестве аргумента функции принимают имя файла или файловый дескриптор (fstat(2)) и возвращают заполненные поля структуры stat, которые приведены в табл. 2.15.

Таблица 2.15. Поля структуры stat

Поле Значение
mode_t st_mode
Тип файла и права доступа
ino_t st_ino
Номер inode.
Поля
st_ino
и
st_dev
однозначно определяют обычные файлы
dev_t st_dev
Номер устройства, на котором расположен файл (номер устройства файловой системы)
dev_t st_rdev
Для специального файла устройства содержит номер устройства, адресуемого этим файлом
nlink_t st_link
Число жестких связей
uid_t st_uid
Идентификатор пользователя-владельца файла
gid_t st_gid
Идентификатор группы-владельца файла
off_t st_size
Размер файла в байтах. Для специальных файлов устройств это поле не определено
time_t st_atime
Время последнего доступа к файлу
time_t st_mtime
Время последней модификации данных файла
time_t st_ctime
Время последней модификации метаданных файла
long st_blksize
Оптимальный размер блока для операций ввода/вывода. Для специальных файлов устройств и каналов это поле не определено
long st_blocks
Число размещенных 512-байтовых блоков хранения данных. Для специальных файлов устройств это поле не определено

Для определения типа файла служат следующие макроопределения, описанные в файле <sys/stat.h>:

Таблица 2.16. Определение типа файла

Макроопределение Тип файла
S_ISFIFO(mode)
FIFO
S_ISCHR(mode)
Специальный файл символьного устройства
S_ISDIR(mode)
Каталог
S_ISBLK(mode)
Специальный файл блочного устройства
S_ISREG(mode)
Обычный файл
S_ISLNK(mode)
Символическая связь
S_ISSOCK(mode)
Сокет

Все значения времени, связанные с файлом (время доступа, модификации данных и метаданных) хранятся в секундах, прошедших с 0 часов 1 января 1970 года. Заметим, что информация о времени создания файла отсутствует.

Приведенная ниже программа выводит информацию о файле, имя которого передается ей в качестве аргумента:

#include <sys/types.h>

#include <sys/stat.h>

#include <time.h>

main(int argc, char *argv[]) {

 struct stat s;

 char* ptype;

 lstat(argv[1] , &s); /* Определим тип файла */

 if (S_ISREG(s.st_mode)) ptype = "Обычный файл";

 else if (S_ISDIR(s.st_mode)) ptype = "Каталог";

 else if (S_ISLNK(s.st_mode)) ptype = "Симв.
Связь";

 else if (S_ISCHR(s.st_mode)) ptype = "Симв. Устройство";

 else if (S_ISBLK(s.st_mode)) ptype = "Бл.устройство";

 else if (S_ISSOCK(s.st_mode)) ptype = "Сокет";

 else if (S_ISFIFO(s.st_mode)) ptype = "FIFO";

 else ptype = "Неизвестный тип";

 /* Выведем информацию о файле */

 /* Его тип */

 printf("type = %s\n", ptype);

 /* Права доступа */

 printf("perm =%o\n", s.st_mode & S_IAMB);

 /* Номер inode */

 printf("inode = %d\n", s.st_ino);

 /* Число связей */

 printf("nlink = %d\n", s.st_nlink);

 /* Устройство, на котором хранятся данные файла */

 printf("dev = (%d, %d)\n", major(s.st_dev), minor(s.st_dev));

 /* Владельцы файла */

 printf("UID = %d\n", s.st_uid);

 printf("GID = %d\n", s.st_gid);

 /* Для специальных файлов устройств - номера устройства */

 printf("rdev = (%d, %d)\n", major(s.st_rdev),

 minor(s.st_rdev));

 /* Размер файла */

 printf("size = %d\n", s.st_size);

 /* Время доступа, модификации и модификации метаданных */

 printf("atime = %s", ctime(&s.st_atime));

 printf("mtime = %s", ctime(&s.st_mtime));

 printf("ctime = %s", ctime(&s.st_ctime));

}

Программа использует библиотечные функции major(3C) и minor(3C), возвращающие, соответственно, старший и младший номера устройства. Функция ctime(3C) преобразует системное время в удобный формат.

Запуск программы на выполнение приведет к следующим результатам:

$ а.out ftype.c

type = Обычный файл

perm = 644

inode = 13

nlink = 1

dev = (1, 42)

UID = 286

GID = 100

rdev = (0, 0)

size = 1064

atime = Wed Jan 8 17:25:34 1997

mtime = Wed Jan 8 17:19:27 1997

ctime = Wed Jan 8 17:19:27 1997

$ ls -il /tmp/ftype.c

13 -rw-r--r-- 1 andy user 1064 Jan 8 17:19 ftype.c

Процессы

В главе 1 уже упоминались процессы. Однако знакомство ограничивалось пользовательским, или командным интерфейсом операционной системы. В этом разделе попробуем взглянуть на них с точки зрения программиста.

Процессы являются основным двигателем операционной системы. Большинство функций выполняется ядром требованию того или иного процесса. Выполнение этих функций контролируется привилегиями процесса, которые соответствуют привилегиям пользователя, запустившего его.

В этом разделе рассматриваются:

 Идентификаторы процесса

 Программный интерфейс управления памятью: системные вызовы низкого уровня и библиотечные функции, позволяющие упростить управление динамической памятью процесса.

 Важнейшие системные вызовы, обеспечивающие создание нового процесса и запуск новой программы. Именно с помощью этих вызовов создается существующая популяция процессов в операционной системе и ее функциональность.

 Сигналы и способы управления ими. Сигналы можно рассматривать как элементарную форму межпроцессного взаимодействия, позволяющую процессам сообщать друг другу о наступлении некоторых событий. Более мощные средства будут рассмотрены в разделе "Взаимодействие между процессами" главы 3.

Поделиться с друзьями: