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

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

Жанры

Linux программирование в примерах
Шрифт:

49 if (fp == NULL) {

50 fprintf(stderr, "%s: %s: could not open: %s\n",

51 myname, filename, strerror(errno));

52 exit(1);

53 }

54

55 while ((fs = getmntent(fp)) != NULL)

56 do_statvfs(fs);

57

58 endmntent(fp);

59 }

Строки 1–59 в сущности те же самые, как и для

ch08-mounted.c
.
main
обрабатывает командную стоку, a
process
просматривает в цикле каждую смонтированную файловую систему.
do_statvfs
осуществляет действительную работу, выводя для каждой интересующей файловой системы
struct statvfs
.

61 /* do_statvfs --- Использовать statvfs и вывести сведения */

62

63 void do_statvfs(const struct mntent *fs)

64 {

65 struct statvfs vfs;

66

67 if (fs->mnt_fsname[0] != '/') /* пропустить ненастоящие файловые системы */

68 return;

69

70 if (statvfs(fs->mnt_dir, &vfs) != 0) {

71 fprintf(stderr, "%s: %s: statvfs failed: %s\n",

72 myname, fs->mnt_dir, strerror(errno));

73 errors++;

74 return;

75 }

76

77 printf("%s, mounted on %s:\n", fs->mnt_dir, fs->mnt_fsname);

78 printf("\tf_bsize: %ld\n", (long)vfs.f_bsize);

79 printf("\tf_frsize: %ld\n", (long)vfs.f_frsize);

80 printf("\tf_blocks: %lu\n", (unsigned long)vfs.f_blocks);

81 printf("\tf_bfree: %lu\n", (unsigned long)vfs.f_bfree);

82 printf("\tf_bavail: %lu\n", (unsigned long)vfs.f_bavail);

83 printf("\tf_files: %lu\n", (unsigned long)vfs.f_files);

84 printf("\tf_ffree: %lu\n", (unsigned long)vfs.f_ffree);

85 printf("\tf_favail: %lu\n", (unsigned long)vfs.f_favail);

86 printf("\tf_fsid: %#lx\n", (unsigned long)vfs.f_fsid);

87

88 printf("\tf_flag: ");

89 if (vfs.f_flag == 0)

90 printf("(none)\n");

91 else {

92 if ((vfs.f_flag & ST_RDONLY) != 0)

93 printf("ST_RDONLY ");

94 if ((vfs.f_flag & ST_NOSUID) != 0)

95 printf("ST_NOSUID");

96 printf("\n");

97 }

98

99 printf("\tf_namemax: %#ld\n", (long)vfs.f_namemax);

100 }

Строки 67–68 пропускают файловые системы, которые не основываются на реальных дисковых устройствах. Это означает, что файловые системы типа

/proc
или
/dev/pts
игнорируются. (Правда, эта проверка эвристическая, но она работает: в
/etc/mtab
смонтированные устройства перечислены по полному пути устройства: например,
/dev/hda1
.) Строка 70 вызывает
statvfs
с соответствующей проверкой ошибок, а строки 77-99 выводят сведения.

Строки 89–96 имеют дело с флагами: отдельные биты информации, которые присутствуют или не присутствуют. Обсуждение того, как биты флагов используются в коде С, см. во врезке. Вот вывод

ch08-statvfs
:

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

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

f_bsize: 4096

f_frsize: 4096

f_blocks: 1549609

f_bfree: 316663

f_bavail: 237945

f_files: 788704

f_ffree: 555482

f_favail: 555482

f_fsid: 0

f_flag: (none)

f_namemax: 255

...

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

f_bsize: 4096

f_frsize: 4096

f_blocks: 2092383

f_bfree: 1391952

f_bavail: 1391952

f_files: 0

f_ffree: 0

f_favail: 0

f_fsid: 0

f_flag: ST_NOSUID

f_namemax: 260

Во время написания этого, для GLIBC 2.3.2 и ранее, GNU

df
не использует
statvfs
. Это потому, что код читает
/etc/mtab
и вызывает
stat
для каждой смонтированной файловой системы, чтобы найти ту, номер устройства которой совпадает с соответствующим аргументом для файла (или дескриптора файла). Для того, чтобы прочесть опции монтирования, коду нужно найти файловую систему, поэтому он может установить биты
f_flag
. Проблема в том, что
stat
на смонтированной удаленной файловой системе, сервер которой недоступен, может висеть неопределенно долго, вызвав также зависание
df
. С тех пор эта проблема в GLIBC была исправлена, но
df
не будет изменяться в течение некоторого времени, так что она сможет продолжать работать на более старых системах.

ЗАМЕЧАНИЕ. Хотя POSIX определяет

statvfs
и
fstatvfs
, не все системы их поддерживают или поддерживают корректно. Многие системы (включая Linux, как вскоре будет описано), имеют свои собственные системные вызовы, предоставляющие сходную информацию. GNU
df
использует библиотечную процедуру для получения сведений о файловой системе; исходный файл для этой процедуры наполнен
#ifdef
для большого числа различных систем. Со временем ситуация с переносимостью должна улучшиться.

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

Здравствуй, Мир!

Француз Михаил
Фантастика:
рпг
попаданцы
6.25
рейтинг книги
Здравствуй, Мир!

Законы Рода. Том 8

Мельник Андрей
8. Граф Берестьев
Фантастика:
юмористическое фэнтези
аниме
фэнтези
5.00
рейтинг книги
Законы Рода. Том 8

Локки 10. Потомок бога

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

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

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

Последний Паладин. Том 14

Саваровский Роман
14. Путь Паладина
Фантастика:
аниме
фэнтези
попаданцы
5.75
рейтинг книги
Последний Паладин. Том 14

Наномашины, внучок! Том 2

Новиков Николай Васильевич
2. Чего смотришь? Иди книгу читай
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Наномашины, внучок! Том 2

Геном хищника. Книга третья

Гарцевич Евгений Александрович
3. Я - Легенда!
Фантастика:
боевая фантастика
рпг
попаданцы
5.00
рейтинг книги
Геном хищника. Книга третья

Кодекс Охотника. Книга XXXVI

Винокуров Юрий
36. Кодекс Охотника
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Кодекс Охотника. Книга XXXVI

Лейб-хирург

Дроздов Анатолий Федорович
2. Зауряд-врач
Фантастика:
альтернативная история
7.34
рейтинг книги
Лейб-хирург

Кодекс Охотника. Книга III

Винокуров Юрий
3. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
7.00
рейтинг книги
Кодекс Охотника. Книга III

Белый Волк

Мазин Александр Владимирович
2. Викинг
Приключения:
исторические приключения
9.12
рейтинг книги
Белый Волк

Газлайтер. Том 39

Володин Григорий Григорьевич
39. История Телепата
Фантастика:
боевая фантастика
юмористическая фантастика
аниме
попаданцы
5.00
рейтинг книги
Газлайтер. Том 39

Цивилизация статуса (сборник)

Шекли Роберт
Сборники Роберта Шекли
Фантастика:
фэнтези
8.22
рейтинг книги
Цивилизация статуса (сборник)

Двойник короля 15

Скабер Артемий
15. Двойник Короля
Фантастика:
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Двойник короля 15