Книга: Linux программирование в примерах
Упражнения
Упражнения
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
. Теперь добавьте вокруг критического раздела блокирование/разблокирование и посмотрите, есть ли разница.
- 10.1. Введение
- 10.2. Действия сигналов
- 10.3. Стандартные сигналы С: signal() и raise()
- 10.4. Обработчики сигналов в действии
- 10.5. API сигналов System V Release 3: sigset() и др.
- 10.6. Сигналы POSIX
- 10.7. Сигналы для межпроцессного взаимодействия
- 10.8. Важные сигналы специального назначения
- 10.9. Сигналы, передающиеся через fork() и exec()
- 10.10. Резюме
- Упражнения