Снисходительные родители: минимальный надзор — КиберПедия 

Археология об основании Рима: Новые раскопки проясняют и такой острый дискуссионный вопрос, как дата самого возникновения Рима...

Эмиссия газов от очистных сооружений канализации: В последние годы внимание мирового сообщества сосредоточено на экологических проблемах...

Снисходительные родители: минимальный надзор

2021-01-29 64
Снисходительные родители: минимальный надзор 0.00 из 5.00 0 оценок
Заказать работу

 

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

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

Следующая программа,, блокирует до тех пор, пока не будет готова восстановить потомков.

 

 

Массив потомков отслеживает ID порожденных процессов. Если элемент содержит, он не представляет необработанного потомка. (Его инициализируют строки 89–90 внизу) указывает, сколько значений в следует проверить.

 

 

Поскольку обработчики сигналов не должны вызывать функции семейства, мы предусмотрели для преобразования десятичного сигнала или номера PID в строку простую «вспомогательную» функцию. Это примитивно, но работает.

 

Строки 51 и 58 выводят «входное» и «завершающее» сообщения, так что мы можем ясно видеть, когда вызывается обработчик сигнала. Другие сообщения начинаются с ведущего символа TAB.

Главной частью обработчика сигнала является большой цикл, строки 52–77. Строки 53–54 проверяют на  и продолжают цикл, если текущий слот не используется.

Строка 57 вызывает с PID текущего элемента. Мы предусмотрели опцию, которая заставляет возвращаться немедленно, если затребованный потомок недоступен. Этот вызов необходим, так как возможно, что не все потомки завершились.

Основываясь на возвращенном значении, код предпринимает соответствующее действие. Строки 57–62 обрабатывают случай обнаружения потомка, выводя сообщение и помещая в соответствующий слот в значение.

Строки 63–67 обрабатывают случай, когда затребованный потомок недоступен. В этом случае возвращается значение 0, поэтому выводится сообщение, и выполнение продолжается.

Строки 68–70 обрабатывают случай, при котором был прерван системный вызов. В этом случае самым подходящим способом обработки является обратно на вызов. (Поскольку блокирует все сигналы при вызове обработчика сигнала [строка 96], это прерывание не должно случиться. Но этот пример показывает, как обработать все случаи.)

Строки 71–76 обрабатывают любую другую ошибку, выводя соответствующее сообщение об ошибке.

 

 

 

Строки 89–90 инициализируют. Строка 92 инициализирует. Строки 94–97 настраивают и устанавливают обработчик сигнала для. Обратите внимание на использование в строке 94, тогда как строка 96 блокирует все сигналы при вызове обработчика.

Строки 99–100 создают набор сигналов, представляющих, а строка 102 устанавливает их в качестве маски сигналов процесса для программы.

Строки 104–109 создают пять порожденных процессов, каждый из которых засыпает на три секунды. По ходу дела они обновляют массив и переменную.

Строка 111 дает затем потомкам шанс завершиться, заснув на еще больший промежуток времени. (Это не гарантирует, что порожденные процессы завершатся, но шансы довольно велики.)

Наконец, строки 113–114 выводят сообщение и приостанавливаются, заменив маску сигналов процесса, блокирующую, пустой маской. Это дает возможность появиться сигналу, что в свою очередь вызывает запуск обработчика сигнала. Вот что происходит:

ch10‑reap1

 

 

Обработчик сигнала собирает сведения о потомках за один проход.

Следующая программа,, сходна с. Разница в том, что она допускает появление сигнала в любое время. Такое поведение увеличивает шанс получения более одного, но не гарантирует это. В результате обработчик сигнала все равно должен быть готов обработать в цикле несколько потомков.

 

Это идентично предыдущей версии за тем исключением, что у нас есть новая переменная,, указывающая, сколько имеется не опрошенных потомков. Строки 15 и 64 помечают новый код.

 

Здесь код также почти идентичен. Строки 104 и 114 закомментированы из предыдущей версии, а строки 111, 116 и 119 добавлены. Удивительно, при запуске поведение меняется в зависимости от версии ядра!

uname ‑a

 

ch10‑reap2

 

 

В данном примере на каждый процесс поступает ровно один! Хотя это прекрасно и полностью воспроизводимо на этой системе, это также необычно. Как на более раннем, так и на более позднем ядре и на Solaris программа получает один сигнал для более чем одного потомка:

uname ‑a

 

ch10‑reap2

 

ЗАМЕЧАНИЕ. В коде для есть один важный дефект – состояние гонки. Взгляните еще раз на строки 106–112 в. Что случится, если появится при исполнении этого кода? Массив и переменные и могут оказаться разрушенными: код в добавляет новый процесс, но обработчик сигнала вычитает один.

Этот пример кода является отличным примером критического раздела; он не должен прерываться при исполнении. Правильным способом работы с этим кодом является заключение его между вызовами, которые сначала блокируют, а затем разблокируют.

 

 


Поделиться с друзьями:

Состав сооружений: решетки и песколовки: Решетки – это первое устройство в схеме очистных сооружений. Они представляют...

Двойное оплодотворение у цветковых растений: Оплодотворение - это процесс слияния мужской и женской половых клеток с образованием зиготы...

Поперечные профили набережных и береговой полосы: На городских территориях берегоукрепление проектируют с учетом технических и экономических требований, но особое значение придают эстетическим...

Таксономические единицы (категории) растений: Каждая система классификации состоит из определённых соподчиненных друг другу...



© cyberpedia.su 2017-2024 - Не является автором материалов. Исключительное право сохранено за автором текста.
Если вы не хотите, чтобы данный материал был у нас на сайте, перейдите по ссылке: Нарушение авторских прав. Мы поможем в написании вашей работы!

0.014 с.