Упражнения

Упражнения

1. Используйте read() и memcmp() для написания простой версии программы cmp, которая сравнивает два файла. Вашей версии не нужно поддерживать какие-нибудь опции.

2. Используйте макрос <stdio.h> getc() и прямое сравнение каждого прочитанного символа для написания другой версии cmp, которая сравнивает два файла. Сравните производительность этой версии с производительностью написанной в предыдущем упражнении.

3. (Средней трудности) Рассмотрите функции <stdio.h> fgets() и GLIBC getline(). Полезна ли memcpy() для их реализации? Набросайте с ее использованием возможную реализацию fgets().

4. (Трудное) Найдите исходный код GLIBC версии memcmp(). Он должен быть на одном из CD-ROM с исходным кодом в вашем дистрибутиве GNU/Linux, или же вы можете найти его в сети. Исследуйте код и объясните его.

5. Проверьте свою память. Как tmpfile() организует удаление файла, когда закрыт указатель файла?

6. Используя mkstemp() и fdopen(), а также другие необходимые функции или системные вызовы, напишите свою версию tmpfile(). Протестируйте ее тоже.

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, замещаться должно не только первое совпадение, но и все остальные совпадения в строке.

Поделитесь на страничке

Следующая глава >

Похожие главы из других книг

3.7 УПРАЖНЕНИЯ

Из книги Архитектура операционной системы UNIX автора Бах Морис Дж

3.7 УПРАЖНЕНИЯ 1. Рассмотрим функцию хеширования применительно к Рисунку 3.3. Наилучшей функцией хеширования является та, которая единым образом распределяет блоки между хеш-очередями. Что Вы могли бы предложить в качестве оптимальной функции хеширования? Должна ли эта


Упражнения

Из книги UNIX: взаимодействие процессов автора Стивенс Уильям Ричард

Упражнения 1. На рис 1.1 изображены два процесса, обращающиеся к одному файлу. Если оба процесса только дописывают данные к концу файла (возможно, длинного), какой нужен будет тип синхронизации?2. Изучите заголовочный файл <errno.h> в вашей системе и выясните, как определена


Упражнения

Из книги автора

Упражнения 1. Каким образом биты установки идентификатора пользователя (set-user-ID, SUID) и установки идентификатора группы (set-group-ID) (раздел 4.4 [21]) программы, использующей Posix IPC, влияют на проверку разрешений, описанную в разделе 2.4?2. Когда программа открывает объект IPC, как она


Упражнения

Из книги автора

Упражнения 1. Прочитайте о функции msgctl в разделе 6.5 и измените программу в листинге 3.2 так, чтобы выводился не только идентификатор, но и поле seq структуры ipc_perm.2. Непосредственно после выполнения программы листинга 3.2 мы запускаем программу, создающую две очереди


Упражнения

Из книги автора

Упражнения 1. При переходе от рис. 4.3 к рис. 4.4: что могло бы произойти, если бы дочерний процесс не закрывал дескриптор (close(fd[1]))? 2. Описывая mkfifo в разделе 4.6, мы сказали, что для открытия существующего FIFO или создания нового, если его не существует, следует вызвать mkfifо,


Упражнения

Из книги автора

Упражнения 1.  Говоря о листинге 5.4, мы отметили, что атрибут attr функции mq_open при создании новой очереди является ненулевым; следует указать оба поля: mq_maxmsg и mq_msgsize. Как можно было бы указать только одно из них, не указывая второе, для которого использовать значения атрибутов


Упражнения

Из книги автора

Упражнения 1. Почему на рис. 6.2 для сообщений, передаваемых серверу, используется тип 1?2. Что произойдет с программой с рис. 6.2, если злоумышленник отправит на сервер множество сообщений, но не будет считывать ответы? Что в такой же ситуации произойдет с программой с рис.


Упражнения

Из книги автора

Упражнения 1. Удалите взаимное исключение из листинга 7.2 и убедитесь, что программа работает неправильно, если одновременно запущено более одного производителя.2. Что произойдет с листингом 7.1, если убрать вызов Pthread_join для потока-потребителя?3. Напишите пpoгрaммy,


Упражнения

Из книги автора

Упражнения 1. Измените реализацию в разделе 8.4 таким образом, чтобы приоритет имели считывающие, а не записывающие потоки.2. Сравните скорость работы нашей реализации из раздела 8.4 с предоставленной


Упражнения

Из книги автора

Упражнения 1. Создайте программу locknone из листингов 9.2 и 9.1 и выполните ее много раз. Убедитесь, что программа не работает и результат непредсказуем.2. Измените листинг 9.2 так, чтобы стандартный поток вывода не буферизовался. Как это повлияет на работу


Упражнения

Из книги автора

Упражнения 1. Измените функции produce и consume из раздела 10.6 следующим образом. Поменяйте порядок двух вызовов Sem_wait в потребителе, чтобы возникла ситуация зависания (как описано в разделе 10.6). Затем добавьте вызов printf перед каждым Sem_wait, чтобы было ясно, какой из потоков ожидает


Упражнения

Из книги автора

Упражнения 1. Листинг 6.6 представлял собой измененный вариант листинга 6.4, в котором программа принимала идентификатор очереди вместо полного имени файла. Мы продемонстрировали, что для получения доступа к очереди System V достаточно знать только ее идентификатор


Упражнения

Из книги автора

Упражнения 1. Что произойдет с программой в листинге 12.7, если добавить еще один повтор цикла for?2. Предположим, что имеются два процесса, один из которых отправляет сообщения другому. Для этого используются очереди сообщений System V. Нарисуйте схему передачи сообщений от


Упражнения

Из книги автора

Упражнения 1. Измените программы из листингов 12.6 и 12.7 таким образом, чтобы они работали с разделяемой памятью Posix, а не с отображаемым в память файлом. Убедитесь, что результаты будут такими же, как и для отображаемого в память файла.2. В циклах for в листингах 13.3 и 13.4


Упражнения

Из книги автора

Упражнения 1. Сколько байтов информации передается при вызове door_call от клиента серверу?2. Есть ли необходимость вызывать fstat для проверки типа дескриптора в листинге 15.3? Уберите этот вызов и посмотрите, что произойдет.3. В документации Solaris 2.6 для вызова sleep() говорится, что


Упражнения

Из книги автора

Упражнения 1. При запуске сервер регистрируется в программе отображения портов. Что происходит при завершении сервера, например, клавишей завершения программы с терминала? Что произойдет, если на этот сервер впоследствии придет запрос от клиента?2. Клиент