Читаем Linux программирование в примерах полностью

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. Посмотрите справочную страницу lrand48(3) на системе GNU/Linux или System V. Выглядит ли этот интерфейс более простым или трудным для использования, чем 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. Посмотрите справочную страницу grep(1). Добавьте к ch12-grep.c стандартные опции -e, -s и -v.

19. Напишите простую замещающую программу:

subst [-g] шаблон подстановка [файлы ...]

Она должна читать текстовые строки из указанных файлов или из стандартного ввода, если они не указаны. Каждая строка должна сравниваться на соответствие шаблону. Если обнаружено соответствие, оно должно замещаться подстановкой.

Если указана опция -g, замещаться должно не только первое совпадение, но и все остальные совпадения в строке.

<p>Глава 13</p><p>Интернационализация и локализация</p>

Ранние вычислительные системы обычно для своего вывода (приглашений, сообщений об ошибках) и ввода (ответы на запросы, такие, как «да» и «нет») использовали английский язык. Это было верно для систем Unix вплоть до середины 1980-х. В конце 80-х, начиная с первого стандарта ISO для С и продолжая стандартами POSIX 1990-х и современным стандартом POSIX, были разработаны возможности для работы программ на нескольких языках без необходимости поддержки нескольких версий одной и той же программы. Данная глава описывает, как современные программы должны справляться с многоязычными проблемами.

<p>13.1. Введение</p>

Центральной концепцией является окружение, место, в котором работает программа. Локали содержат в себе следующие сведения: локальный набор символов; сведения о формате отображения даты и времени; форматирование и отображение денежных сумм; форматирование и отображение числовых значений (с или без разделителей тысяч, какой символ используется в качестве разделителя дробной части числа и т.д.).

Перейти на страницу:

Похожие книги

C++ Primer Plus
C++ Primer Plus

C++ Primer Plus is a carefully crafted, complete tutorial on one of the most significant and widely used programming languages today. An accessible and easy-to-use self-study guide, this book is appropriate for both serious students of programming as well as developers already proficient in other languages.The sixth edition of C++ Primer Plus has been updated and expanded to cover the latest developments in C++, including a detailed look at the new C++11 standard.Author and educator Stephen Prata has created an introduction to C++ that is instructive, clear, and insightful. Fundamental programming concepts are explained along with details of the C++ language. Many short, practical examples illustrate just one or two concepts at a time, encouraging readers to master new topics by immediately putting them to use.Review questions and programming exercises at the end of each chapter help readers zero in on the most critical information and digest the most difficult concepts.In C++ Primer Plus, you'll find depth, breadth, and a variety of teaching techniques and tools to enhance your learning:• A new detailed chapter on the changes and additional capabilities introduced in the C++11 standard• Complete, integrated discussion of both basic C language and additional C++ features• Clear guidance about when and why to use a feature• Hands-on learning with concise and simple examples that develop your understanding a concept or two at a time• Hundreds of practical sample programs• Review questions and programming exercises at the end of each chapter to test your understanding• Coverage of generic C++ gives you the greatest possible flexibility• Teaches the ISO standard, including discussions of templates, the Standard Template Library, the string class, exceptions, RTTI, and namespaces

Стивен Прата

Программирование, программы, базы данных