Читать книгу 📗 "Linux программирование в примерах - Роббинс Арнольд"
$ <b>ch10-reap2</b> /* Запустить программу */waiting for signalsEntered childhandler /* Опрос одного потомка */ reaped process 2702 pid 2703 not available yet pid 2704 not available yet pid 2705 not available yet pid 27 06 not available yetExited childhandlerwaiting for signalsEntered childhandler /* И следующего */ reaped process 2703 pid 2704 not available yet pid 2705 not available yet pid 2706 not available yetExited childhandlerwaiting for signalsEntered childhandler /* И так далее */ reaped process 2704 pid 2705 not available yet pid 2706 not available yetExited childhandlerwaiting for signalsEntered childhandler reaped process 2705 pid 2706 not available yetExited childhandlerwaiting for signalsEntered childhandler reaped process 2706Exited childhandlerВ данном примере на каждый процесс поступает ровно один
SIGCHLD$ <b>uname -a</b> /* Отобразить версию системы */Linux example2 2.4.22-1.2115.npt1 #1 Wed Oct 29 15:42:51 EST 2003 i686 i686 i386 GNU/Linux$ <b>ch10-reap2</b> /* Запуск программы */waiting for signalsEntered childhandler /* Обработчик сигнала вызван лишь однажды */ reaped process 9564 reaped process 9565 reaped process 9566 reaped process 9567 reaped process 9568Exited childhandlerЗАМЕЧАНИЕ. В коде для
ch10-reap2.cch10-reap2.cSIGCHLDkidsnkidskidsleftmainЭтот пример кода является отличным примером критического раздела; он не должен прерываться при исполнении. Правильным способом работы с этим кодом является заключение его между вызовами, которые сначала блокируют, а затем разблокируют
SIGCHLD10.8.3.3. Строгий родительский контроль
Структура
siginfo_tsi_codesiginfo_tСледующая программа,
ch10-status.csiginfo_t1 /* ch10-status.c --- демонстрирует управление SIGCHLD, используя обработчик с 3 аргументами */23 #include <stdio.h>4 #include <errno.h>5 #include <signal.h>6 #include <string.h>7 #include <sys/types.h>8 #include <sys/wait.h>910 void manage(siginfo_t *si);11/* ...не изменившийся для format_num() код опущен... */Таблица 10.5. Значения
si_codeSIGCHLD| Значение | Смысл |
|---|---|
CLD_CONTINUED | Остановленный потомок был возобновлен. |
CLD_DUMPED | Потомок завершился с ошибкой, создан образ процесса |
CLD_EXITED | Потомок завершился нормально. |
CLD_KILLED | Потомок был завершен сигналом |
CLD_STOPPED | Порожденный процесс был остановлен. |
CLD_TRAPPED | Трассируемый потомок остановлен (Это условие возникает, когда программа трассируется — либо из отладчика, либо для мониторинга реального времени В любом случае, вы вряд ли увидите его в обычных ситуациях.) |
Строки 3–8 включают стандартные заголовочные файлы, строка 10 объявляет
manage()format_num()