Таблица 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
#include
#include
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.
□ Группы и сеансы; взаимодействие процесса с пользователем.
□ Ограничения, накладываемые на процесс, и функции, которые позволяют управлять этими ограничениями.
Вы уже знаете, что каждый процесс характеризуется набором атрибутов и идентификаторов, позволяющих системе управлять его работой. Важнейшими из них являются идентификатор процесса PID и идентификатор родительского процесса PPID. PID является именем процесса в операционной системе, по которому мы можем адресовать его, например, при отправлении сигнала. PPID указывает на родственные отношения между процессами, которые (как и в жизни) в значительной степени определяют его свойства и возможности.
Читать дальше