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

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

Жанры

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

6 * Всегда используйте stat для файла, буфер stat используется кодом

7 * более высокого уровня.

8 * if (AWKBUFSIZE == "exact")

9 * return the file size

10 * else if (AWKBUFSIZE == число)

11 * всегда возвращать это число

12 * else

13 * if размер < default_blocksize

14 * return размер

15 * else

16 * return default_blocksize

17 * end if

18 * end if

19 *

20 * Приходится повозиться, чтобы иметь дело с AWKBUFSIZE лишь

21 * однажды, при первом вызове этой процедуры, а не при каждом

22 * ее вызове. Производительность, знаете ли.

23 */

24

25 size_t

26 optimal_bufsize(fd, stb)

27 int fd;

28 struct stat *stb;

29 {

30 char *val;

31 static size_t env_val = 0;

32 static short first = TRUE;

33 static short exact = FALSE;

34

35 /* обнулить все члены, на случай, если ОС их не использует. */

36 memset(stb, '\0', sizeof(struct stat));

37

38 /* всегда использовать stat на случай, если stb используется кодом более высокого уровня */

39 if (fstat(fd, stb) == -1)

40 fatal("can't stat fd %d (%s)", fd, strerror(errno));

41

42 if (first) {

43 first = FALSE;

44

45 if ((val = getenv("AWKBUFSIZE")) != NULL) {

46 if (strcmp(val, "exact") == 0)

47 exact = TRUE;

48 else if (ISDIGIT(*val)) {

49 for (; *val && ISDIGIT(*val); val++)

50 env_val = (env_val * 10) + *val - '0';

51

52 return env_val;

53 }

54 }

55 } else if (!exact && env_val > 0)

56 return env_val;

57 /* else

58 обрабатывать дальше */

59

60 /*

61 * System V.n, n < 4, не имеет в структуре stat размера системного

62 * блока файла. Поэтому нам нужно осуществить разумную догадку.

63 * Мы используем BUFSIZ из stdio, поскольку именно это имелось

64 * в виду прежде всего.

65 */

66 #ifdef HAVE_ST_BLKSIZE

67 #define DEFBLKSIZE (stb->st_blksize > 0 ? stb->st_blksize : BUFSIZ)

68 #else

69 #define DEFBLKSIZE BUFSIZ

70 #endif

71

72 if (S_ISREG(stb->st_mode) /* обычный файл */

73 && 0 < stb->st_size /* ненулевой размер */

74 && (stb->st_size < DEFBLKSIZE /* маленький файл */

75 || exact)) /* или отладка */

76 return stb->st_size; /* использовать размер файла*/

77

78 return DEFBLKSIZE;

79 }

Комментарий в строках 3–23 объясняет алгоритм. Поскольку поиск переменных окружения может быть затратным и его нужно осуществить лишь однажды, функция использует для сбора соответствующих сведений в первый раз несколько статических переменных.

Строки 42–54 выполняются лишь при первом вызове функции. Строка 43 обеспечивает это условие, устанавливая в

first
значение
false
. Строки 45–54 обрабатывают переменную окружения, разыскивая либо строку
"exact"
, либо число. В последнем случае оно преобразуется из строкового значения в десятичное, сохраняясь в
env_val
. (Возможно, нам следовало бы использовать здесь
strtoul
; в свое время это не пришло нам на ум.)

Строка 55 выполняется каждый раз, кроме первого. Если было представлено числовое значение, условие будет истинным, и возвращается это значение (строка 56). В противном случае, исполнение переходит к оставшейся части функции.

Строки 60–70 определяют

DEFBLKSIZE
; эта часть не изменилась. Наконец, строки 72–76 возвращают размер файла, если это приемлемо. Если нет (строка 78), возвращается
DEGBLKSIZE
.

Мы действительно устранили проблему [174] , но между тем оставили на месте новую версию

optimal_bufsize
, чтобы можно было убедиться, что проблема не возникнет вновь.

174

Переписав код управления буфером! — Примеч. автора.

Незначительное увеличение размера кода и его сложности более чем компенсируется возросшей гибкостью, которая есть теперь у нас для тестирования. Более того, поскольку это код изделия, пользователь в полевых условиях может с легкостью использовать эту особенность для тестирования, чтобы определить, не появилась ли сходная проблема. (До сих пор нам не приходилось просить проделать этот тест, но приятно осознавать, что мы могли бы это сделать, если бы пришлось.)

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

Запечатанный во тьме. Том 1. Тысячи лет кача

NikL
1. Хроники Арнея
Фантастика:
уся
эпическая фантастика
фэнтези
5.00
рейтинг книги
Запечатанный во тьме. Том 1. Тысячи лет кача

Я все еще князь. Книга XXI

Дрейк Сириус
21. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я все еще князь. Книга XXI

Я еще князь. Книга XX

Дрейк Сириус
20. Дорогой барон!
Фантастика:
юмористическое фэнтези
попаданцы
аниме
5.00
рейтинг книги
Я еще князь. Книга XX

Ренегат космического флота

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

Тринадцатый XIII

NikL
13. Видящий смерть
Фантастика:
городское фэнтези
аниме
фэнтези
попаданцы
5.00
рейтинг книги
Тринадцатый XIII

Солнечный флот

Вайс Александр
4. Фронтир
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Солнечный флот

Дважды одаренный. Том VI

Тарс Элиан
6. Дважды одаренный
Фантастика:
аниме
альтернативная история
фэнтези
фантастика: прочее
5.00
рейтинг книги
Дважды одаренный. Том VI

Идеальный мир для Лекаря 7

Сапфир Олег
7. Лекарь
Фантастика:
юмористическая фантастика
попаданцы
аниме
5.00
рейтинг книги
Идеальный мир для Лекаря 7

Боярич Морозов

Шелег Дмитрий Витальевич
3. Наследник старого рода
Фантастика:
героическая фантастика
боевая фантастика
альтернативная история
7.12
рейтинг книги
Боярич Морозов

Барон Дубов 2

Карелин Сергей Витальевич
2. Его Дубейшество
Фантастика:
юмористическое фэнтези
аниме
сказочная фантастика
фэнтези
5.00
рейтинг книги
Барон Дубов 2

Бастард Императора. Том 3

Орлов Андрей Юрьевич
3. Бастард Императора
Фантастика:
попаданцы
аниме
фэнтези
5.00
рейтинг книги
Бастард Императора. Том 3

Глэрд VIII: Базис 2

Владимиров Денис
8. Глэрд
Фантастика:
фэнтези
боевая фантастика
попаданцы
5.00
рейтинг книги
Глэрд VIII: Базис 2

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

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

Император Пограничья 6

Астахов Евгений Евгеньевич
6. Император Пограничья
Фантастика:
аниме
фэнтези
фантастика: прочее
попаданцы
5.00
рейтинг книги
Император Пограничья 6