7. Опишите преимущества и недостатки использования unlink()
для имени файла, созданного mkstemp()
, непосредственно после возвращения mkstemp()
.
8. Напишите свою версию mkstemp()
, используя mktemp()
и open()
. Как вы можете обеспечить те же гарантии уникальности, которые обеспечивает mkstemp()
?
9. Программы, использующие mkstemp()
, должны обеспечивать удаление файла при завершении. (Предположим, что файл не удаляется сразу же после открытия по тем или иным причинам.) Это включает в себя случай, когда может поступить сигнал завершения. Поэтому удаление файла должно быть частью перехватчика сигнала. Как вы это сделаете?
10. (Трудное) Даже с урезанной очисткой при обработке сигнала все еще имеется состояние гонки. Есть небольшое окно между созданием временного файла функцией mkstemp()
и возвращением и записью его имени в переменной (для использования функцией обработки сигнала). Если в это окно попадает не перехваченный сигнал, программа завершается и оставляет временный файл. Как вы закроете это окно? (Спасибо Jim Meyering.)
11. Попробуйте откомпилировать и запустить ch12-setjmp.c
на как можно большем количестве различных систем с использованием как можно большего количества различных компиляторов, к каким у вас есть доступ. Попробуйте компилировать с различными уровнями оптимизации. Какие изменения поведения вы видели (если они были)?
12. Посмотрите файл /usr/src/libc/gen/sleep.c
в дистрибутиве исходного кода V7 Unix. Он содержит реализацию функции sleep()
, описанную в разделе 10.8.1 «Сигнальные часы: sleep()
, alarm()
и SIGALARM
». Распечатайте ее и прокомментируйте в стиле наших примеров, чтобы объяснить ее работу.
13. Посмотрите справочную страницу random()
?
14. Возьмите ch08-nftw.c
из раздела 8.4.3 «Перемещение по иерархии: nftw()
» и добавьте опцию --exclude=pattern
. Файлы, соответствующие паттерну, не должны выводиться.
15. (Трудное) Почему GLIBC нужны указатели на альтернативные версии функций стандартных каталогов и stat()
? Не может ли она вызывать их непосредственно?
16. Измените ch12-glob.c
для использования функции wordexp()
. Поэкспериментируйте с ней, проделав несколько дополнительных вещей, которые она предоставляет. Не забудьте взять аргументы командной строки в кавычки, чтобы wordexp()
на самом деле выполнила свою работу!
17. Стандартная grep
выводит имя файла, лишь когда в командной строке указано больше одного файла. Сделайте так, чтобы ch12-grep.c
действовала таким же образом.
18. Посмотрите справочную страницу ch12-grep.c
стандартные опции -e
, -s
и -v
.
19. Напишите простую замещающую программу:
subst [-g]
Она должна читать текстовые строки из указанных
Если указана опция -g
, замещаться должно не только первое совпадение, но и все остальные совпадения в строке.
Глава 13
Интернационализация и локализация
Ранние вычислительные системы обычно для своего вывода (приглашений, сообщений об ошибках) и ввода (ответы на запросы, такие, как «да» и «нет») использовали английский язык. Это было верно для систем Unix вплоть до середины 1980-х. В конце 80-х, начиная с первого стандарта ISO для С и продолжая стандартами POSIX 1990-х и современным стандартом POSIX, были разработаны возможности для работы программ на нескольких языках без необходимости поддержки нескольких версий одной и той же программы. Данная глава описывает, как современные программы должны справляться с многоязычными проблемами.
13.1. Введение
Центральной концепцией является