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

на главную - закладки

Жанры

Linux программирование в примерах

Роббинс Арнольд

Шрифт:

153 }

Чтобы сохранить место, мы опустили

main
, которая не изменилась с представленной ранее другой программы, мы также опустили
process
, которая теперь вызывает
do_statfs
вместо
do_statvfs
.

Строки 13–35 содержат список магических чисел файловых систем из справочной страницы statfs(2). Хотя эти числа можно получить из заголовочных файлов исходного кода ядра, это трудно (мы пробовали), а показанному здесь способу представления следовать легче. Строки 86–125 определяют

type2str
, которая преобразует
магическое число в выводимую строку. Она осуществляет простой линейный поиск в таблице пар (значение, строка). В (маловероятном) случае, когда магическое число в таблице отсутствует,
type2str
создает сообщение «неизвестный тип» и возвращает его (строки 123–124).

do_statfs
(строки 129–153) выводит сведения из
struct statfs
. Член
f_fsid
опущен, поскольку
fsid_t
является непрозрачным типом. Код прост; строка 145 использует
type2str
для вывода типа файловой системы. Как для сходной программы, использующей
statvfs
, эта функция игнорирует файловые системы, которые не расположены на локальных устройствах (строки 133–134). Вот вывод на нашей системе:

$ ch08-statfs /* Запуск программы */

/, mounted on /dev/hda2: /* Результаты для файловой системы ext2 */

f_type: ЕХТ2

f_bsize: 4096

f_blocks: 1549609

f_bfrее: 316664

f_bavail: 237946

f_files: 788704

f_ffree: 555483

f_namelen: 255

...

/win, mounted on /dev/hda1: /* Результаты для файловой с-мы vfat */

f_type: MSDOS

f_bsize: 4096

f_blocks: 2092383

f_bfree: 1391952

f_bavail: 1391952

f_files: 0

f_ffree: 0

f_namelen: 260

В заключение, использование

statvfs
или
statfs
в вашем собственном коде зависит от ваших потребностей. Как описано в предыдущем разделе, GNU
df
не использует
statvfs
под GNU/Linux и в общем имеет тенденцию использовать уникальный для каждой Unix-системы системный вызов «получения сведений о файловой системе». Хотя это работает, это не очень привлекательно. С другой стороны, иногда у вас нет выбора: например, проблемы GLIBC, о которых мы упоминали выше. В этом случае нет безупречного решения.

8.4. Перемещение по иерархии файлов

Несколько системных вызовов и стандартных библиотечных функций дают возможность изменять текущий каталог и определять полный путь к текущему каталогу. Более сложные функции позволяют осуществлять произвольные действия с каждым объектом файловой системы в иерархии каталогов.

8.4.1. Смена каталога:

chdir
и
fchdir

В разделе 1.2 «Модель процессов Linux/Unix» мы говорили:

Текущим каталогом является каталог, относительно которого отсчитываются относительные пути (те, которые не начинаются с

/
).
Это каталог, «в» котором вы находитесь, когда даете оболочке команду '
cd некоторое_место
'.

У каждого процесса есть текущий рабочий каталог. Каждый новый процесс наследует свой текущий каталог от процесса, который его запустил (своего родителя). Две функции позволяют перейти в другой каталог:

#include <unistd.h>

int chdir(const char *path); /* POSIX */

int fchdir(int fd); /* XSI */

Функция

chdir
принимает строку с названием каталога, тогда как
fchdir
ожидает дескриптор файла, который был открыт для каталога с помощью
open
. [83] Обе возвращают 0 при успехе и -1 при ошибке (с
errno
, установленной соответствующим образом). Обычно, если
open
для каталога завершается успешно,
fchdir
также достигает цели, если кто-то не изменил права доступа к каталогу между вызовами, (
fchdir
сравнительно новая функция; на старых системах Unix ее нет.)

83

На системах GNU/Linux и BSD для получения нижележащего дескриптора файла можно применить функцию

dirfd
к указателю
DIR*
, см. справочную страницу GNU/Linux dirfd(3) — Примеч. автора.

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

ch08-chdir.c
, демонстрирует обе функции. Она демонстрирует также, что
fchdir
может потерпеть неудачу, если права доступа открытого каталога не включают доступа на поиск (исполнение).

1 /* ch08-chdir.c --- демонстрация chdir и fchdir.

2 Для краткости проверка ошибок опущена */

3

4 #include <stdio.h>

5 #include <fcntl.h>

6 #include <unistd.h>

7 #include <sys/types.h>

8 #include <sys/stat.h>

9

10 int main(void)

11 {

12 int fd;

13 struct stat sbuf;

14

15 fd = open(".", O_RDONLY); /* открыть каталог для чтения */

16 fstat(fd, &sbuf); /* получить сведения, нужны начальные права доступа */

17 chdir(".."); /* 'cd ..' */

18 fchmod(fd, 0); /* отменить права доступа каталога */

19

20 if (fchdir(fd) < 0) /* попытаться выполнить 'cd' обратно, должно завершиться неудачей */

21 perror("fchdxr back");

22

23 fchmod(fd, sbuf.st_mode & 07777); /* восстановить первоначальные права доступа */

24 close(fd); /* все сделано */

Поделиться:
Популярные книги

Сила рода. Том 1 и Том 2

Вяч Павел
1. Претендент
Фантастика:
фэнтези
рпг
попаданцы
5.85
рейтинг книги
Сила рода. Том 1 и Том 2

Отморозок 4

Поповский Андрей Владимирович
4. Отморозок
Фантастика:
попаданцы
фантастика: прочее
5.00
рейтинг книги
Отморозок 4

Второгодка. Книга 5. Презренный металл

Ромов Дмитрий
5. Второгодка
Фантастика:
городское фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Второгодка. Книга 5. Презренный металл

Последний реанорец. Том III

Павлов Вел
2. Высшая Речь
Фантастика:
фэнтези
попаданцы
5.25
рейтинг книги
Последний реанорец. Том III

Брат мужа

Зайцева Мария
Любовные романы:
5.00
рейтинг книги
Брат мужа

Натиск

Осадчук Алексей Витальевич
12. Последняя жизнь
Фантастика:
аниме
фэнтези
попаданцы
6.20
рейтинг книги
Натиск

Черный Маг Императора 14

Герда Александр
14. Черный маг императора
Фантастика:
аниме
сказочная фантастика
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Черный Маг Императора 14

Потомок бога 3

Решетов Евгений Валерьевич
3. Локки
Фантастика:
аниме
фэнтези
5.00
рейтинг книги
Потомок бога 3

Орден Архитекторов 12

Винокуров Юрий
12. Орден Архитекторов
Фантастика:
фэнтези
5.00
рейтинг книги
Орден Архитекторов 12

Хозяин Теней 3

Петров Максим Николаевич
3. Безбожник
Фантастика:
попаданцы
аниме
фэнтези
фантастика: прочее
5.00
рейтинг книги
Хозяин Теней 3

На границе империй. Том 10. Часть 2

INDIGO
Вселенная EVE Online
Фантастика:
космическая фантастика
5.00
рейтинг книги
На границе империй. Том 10. Часть 2

Противостояние

Гаевский Михаил
2. Стратег
Фантастика:
боевая фантастика
космическая фантастика
5.25
рейтинг книги
Противостояние

Третий Генерал: Тома I-II

Зот Бакалавр
1. Третий Генерал
Фантастика:
городское фэнтези
попаданцы
аниме
сказочная фантастика
5.00
рейтинг книги
Третий Генерал: Тома I-II

Третий Генерал: Том V

Зот Бакалавр
4. Третий Генерал
Фантастика:
городское фэнтези
аниме
сказочная фантастика
попаданцы
5.00
рейтинг книги
Третий Генерал: Том V