Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
А это подборки моих материалов на канале
Приложение 4 к видео (см. Приложение 1, Приложение 2, Приложение 3)
Пример двух дочерних процессов, взаимодействующих посредством сигналов
Сегодня приведу учебный пример использования сигналов при взаимодействии двух дочерних процессов. Для реального взаимодействия, может быть это и не всегда удобно, но в каких-то частных случаях вполне рабочая модель.
Если кратко, то есть родительская программа (процесс), которая запускает два дочерних процессов. Дочерние процессы обмениваются друг с другом сигналами.
Ниже представлена программа - родительский процесс. Он создает два дочерних процесса. Второму дочернему процессу он посылает идентификатор первого дочернего процесса, который уже известен. Далее родительский процесс ожидает, когда оба дочерних процесса заканчивают своё существование.
Ниже представлен первый дочерний процесс. Он создаёт обработчик пользовательского сигнала signal.SIGUSR1. Чтобы узнать идентификатор второго дочернего процесса используется signal.sigwaitinfo. Функция возвращает управление, когда приходит сигнал и возвращает в частности идентификатор процесса, который прислал сигнал. Теперь первый дочерний процесс тоже знает идентификатор второго дочернего процесса.
Второй дочерний процесс получает идентификатор первого дочернего процесса в качестве параметра. Так что он сразу может приступать к посылке сигнала. Но первый сигнал посылается для того, чтобы второй дочерний процесс узнал идентификатор.
Оба дочерних процесса периодически посылают сигналы друг друга и сообщают о получении сигнала.
Результат запуска родительской программы
Пришёл сигнал от 21355
Пришёл сигнал от 21354
Пришёл сигнал от 21355
Пришёл сигнал от 21354
Пришёл сигнал от 21355
Пришёл сигнал от 21354
Пришёл сигнал от 21354
Пришёл сигнал от 21355
Пришёл сигнал от 21354
Пришёл сигнал от 21355
Пришёл сигнал от 21354
Пришёл сигнал от 21355
Пришёл сигнал от 21354
Пришёл сигнал от 21355
Пришёл сигнал от 21354
Пришёл сигнал от 21355
Пришёл сигнал от 21354
Пришёл сигнал от 21355
Пришёл сигнал от 21355
Пришёл сигнал от 21354
Дочерние процессы закончили работу
Мы видим при обмене сигнала может быть разное чередования в их получении. Т.е. в одном дочернем процессе могут сработать подряд два сигнала. Но это многозадачность и здесь синхронизацию приходится делать программно.
Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.