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

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

Жанры

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. Колесо Времени
Фантастика:
фэнтези
7.14
рейтинг книги
Властелин Хаоса (др. изд.)

Наследник

Назимов Константин Геннадьевич
3. Травник
Фантастика:
фэнтези
6.27
рейтинг книги
Наследник

Дарданелльское сражение

Шигин Владимир Виленович
Во славу земли русской
Проза:
историческая проза
5.00
рейтинг книги
Дарданелльское сражение

Эпоха Опустошителя. Том IV

Павлов Вел
4. Вечное Ристалище
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Эпоха Опустошителя. Том IV

Судьба

Буджолд Лоис Макмастер
Мастера фантазии
Фантастика:
научная фантастика
космическая фантастика
5.00
рейтинг книги
Судьба

Русский рок. Малая энциклопедия

Коллектив авторов
Справочная литература:
энциклопедии
7.00
рейтинг книги
Русский рок. Малая энциклопедия

Переписка и деловые бумаги

Чехов Антон Павлович
Документальная литература:
публицистика
5.00
рейтинг книги
Переписка и деловые бумаги

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

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

#Бояръ-Аниме. Газлайтер. Том 37

Володин Григорий Григорьевич
37. История Телепата
Фантастика:
фэнтези
аниме
боевая фантастика
6.25
рейтинг книги
#Бояръ-Аниме. Газлайтер. Том 37

Сердце Дракона. Том 10

Клеванский Кирилл Сергеевич
10. Сердце дракона
Фантастика:
фэнтези
героическая фантастика
боевая фантастика
7.14
рейтинг книги
Сердце Дракона. Том 10

Такие разные миры. Сборник

Шекли Роберт
Звезды мировой фантастики
Фантастика:
научная фантастика
5.00
рейтинг книги
Такие разные миры. Сборник

Призрак

Шатнер Уильям
Звездный путь
Фантастика:
эпическая фантастика
космическая фантастика
5.00
рейтинг книги
Призрак

Виконт. Книга 2. Обретение силы

Юллем Евгений
2. Псевдоним `Испанец`
Фантастика:
боевая фантастика
попаданцы
рпг
7.10
рейтинг книги
Виконт. Книга 2. Обретение силы

Мир приключений 1971 г.

Булычев Кир
Альманах "Мир приключений"
Фантастика:
научная фантастика
7.00
рейтинг книги
Мир приключений 1971 г.