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

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

Жанры

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
для большого числа различных систем. Со временем ситуация с переносимостью должна улучшиться.

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

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

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

Берлинская ночь (сборник)

Керр Филипп
Мастера остросюжетного романа
Проза:
современная проза
5.00
рейтинг книги
Берлинская ночь (сборник)

Под защитой ректора

Аллен Мира
Фантастика:
фэнтези
сказочная фантастика
5.00
рейтинг книги
Под защитой ректора

Хроники инспектора Ротанова

Гуляковский Евгений Яковлевич
Фантастика:
боевая фантастика
6.83
рейтинг книги
Хроники инспектора Ротанова

Александр Македонский. Трилогия

Рено Мэри
2. В лабиринтах истории
Приключения:
исторические приключения
6.25
рейтинг книги
Александр Македонский. Трилогия

Погоня за судьбой

Найдёнова Диана Александровна
Детективы:
триллеры
5.00
рейтинг книги
Погоня за судьбой

Танец убийц

Фагиаш Мария
Проза:
историческая проза
5.00
рейтинг книги
Танец убийц

Три поколения

Пермитин Ефим Николаевич
Проза:
советская классическая проза
5.00
рейтинг книги
Три поколения

Пушкарь. Пенталогия

Корчевский Юрий Григорьевич
Фантастика:
альтернативная история
8.11
рейтинг книги
Пушкарь. Пенталогия

Все московские повести (сборник)

Трифонов Юрий Валентинович
Проза:
советская классическая проза
5.00
рейтинг книги
Все московские повести (сборник)

Всем стоять на Занзибаре (сборник)

Браннер Джон
Шедевры фантастики
Фантастика:
научная фантастика
5.00
рейтинг книги
Всем стоять на Занзибаре (сборник)

Озноб

Малышева Анна Витальевна
Детективы:
прочие детективы
7.44
рейтинг книги
Озноб

Бортнянский

Ковалев Константин Петрович
748. Жизнь замечательных людей
Документальная литература:
биографии и мемуары
5.00
рейтинг книги
Бортнянский

Роканнон (сборник)

Ле Гуин Урсула Кребер
3. Вся Ле Гуин
Фантастика:
социально-философская фантастика
научная фантастика
7.00
рейтинг книги
Роканнон (сборник)