Упражнения

Упражнения

1. Реализуйте bsd_signal() с использованием sigaction().

2. Если у вас не установлен GNU/Linux, запустите на своей системе ch10-catchint. Является ли ваша система традиционной или BSD?

3. Реализуйте функции System V Release 3 sighold(), sigrelse(), sigignore(), sigpause() и sigset(), использовав sigaction() и другие подходящие функции из POSIX API.

4. Потренируйте свои навыки в жонглировании битами. В предположении, что сигнал 0 отсутствует и что имеется не более 31 сигналов, предусмотрите typedef для sigset_t и напишите sigemptyset(), sigfillset(), sigaddset(), sigdelset() и sigismember().

5. Еще немного потренируйте свои навыки жонглирования битами. Повторите предыдущее упражнение, на этот раз предположив, что наибольшим сигналом является 42.

6. Теперь, когда вы сделали предыдущие два упражнения, найдите sigemptyset() и др. в своем заголовочном файле <signal.h>. (Может потребоваться поискать их; они могут быть в #include файлах, указанных в <signal.h>.) Являются ли они макросами или функциями?

7. В разделе 10.7 «Сигналы для межпроцессного взаимодействия» мы упомянули, что код изделия должен работать с начальной маской сигналов процесса, добавляя и удаляя блокируемые сигналы в вызове sigsuspend(). Перепишите пример, используя для этого соответствующие вызовы.

8. Напишите свою собственную версию команды kill. Интерфейс должен быть таким:

kill [-s имя-сигнала] pid ...

Если сигнал не указан, программа должна посылать SIGTERM.

9. Как вы думаете, почему в современных оболочках, таких, как Bash и ksh93, kill является встроенной командой?

10. (Трудное) Реализуйте sleep(), используя alarm(), signal() и pause(). Что случится, если обработчик сигнала для SIGALRM уже установлен?

11. Поэкспериментируйте с ch10-reap.c, изменяя интервал времени, на который засыпает каждый потомок, и организуя достаточное число вызовов sigsuspend() для сбора сведений о всех потомках.

12. Попробуйте заставить ch10-reap2.c испортить информацию в kids, nkids и kidsleft. Теперь добавьте вокруг критического раздела блокирование/разблокирование и посмотрите, есть ли разница.