Книга: Linux программирование в примерах
Упражнения
Упражнения
1. Напишите функцию lockf()
, используя fcntl()
для осуществления блокировки.
2. Каталог /usr/src/linux/Documentation
содержит набор файлов, которые описывают различные аспекты поведения операционной системы. Прочитайте файлы locks.txt
и mandatory.txt
, чтобы получить больше сведений об обработке Linux блокировок файлов.
3. Запустите на своей системе программу ch14-lockall
без обязательной блокировки и посмотрите, сможете ли изменить файл-операнд.
4. Если у вас не-Linux система, поддерживающая обязательную блокировку, попробуйте исполнить на ней программу ch14-lockall
.
5. Напишите функцию strftimes()
следующего вида:
size_t strftimes(char *buf, size_t size, const char *format,
const struct timeval *tp);
Она должна вести себя подобно стандартной функции strftime()
за тем исключением, что должна использовать %q
для обозначения «текущего числа микросекунд».
6. Используя только что написанную функцию strftimes()
, напишите расширенную версию date, которая принимает форматирующую строку, начинающуюся с ведущего +
, и форматирует текущие дату и время (см. date(1)).
7. Обработка тайм-аута в ch14-timers.c
довольно примитивна. Перепишите программу с использованием setjmp()
после вывода приглашения и longjmp()
из обработчика сигнала. Улучшает ли это структуру или ясность программы?
8. Мы заметили, что ch14-timers.c
содержит намеренное состояние гонки. Предположим, пользователь вводит ответ в нужное время, но ch14-timers
приостановлена, прежде чем сигнал может быть отменен. Какой вызов вы сделаете, чтобы уменьшить размер проблемного окна?
9. Нарисуйте дерево, как показано в выводе ch14-tsearch
в разделе 14.4.5 «Обход дерева: twalk()
».
10. Исследуйте файл /usr/share/dict/words
на системе GNU/Linux. (Это словарь проверки правописания для spell
; на различных системах он может находиться в разных местах.) В файле слова размешены в отсортированном порядке, по одному в строке.
Для начала используйте программу awk
для создания нового списка в случайном порядке:
$ awk '{ list[$0]++ }
> END { for (i in list) print i }' /usr/share/dict/words > /tmp/wlist
Далее, напишите две программы. Каждая должна читать новый список и сохранять каждое прочитанное слово в дереве и массиве соответственно. Вторая программа должна использовать для сортировки массива qsort()
, а для поиска — bsearch()
. Получите из дерева или массива слово 'gravy
'. Вычислите время работы двух программ, чтобы увидеть, какая быстрее. Вам может потребоваться заключить получение слова внутрь цикла, повторяющегося множество раз (скажем, 1000), чтобы получить достаточное для определения разницы время.
Используйте вывод ps, чтобы посмотреть, сколько памяти используют программы
11. Повторно запустите обе программы, использовав оригинальный отсортированный словарный файл, и посмотрите, как изменятся временные результаты (если они вообще изменятся).