Доброго времени суток, читатели, зрители моего канала programmer's notes. Не забывайте подписываться и писать свои комментарии к моим статьям и видео.
А это подборки моих материалов на канале
Приложение 2 к видео (см. Приложение 1)
Рассмотрим некоторые вопросы взаимодействия родительского и дочернего процессов
Вообще вопрос взаимодействие родительского и дочернего процесса или двух дочерних процессов возникает рано или поздно, когда вы занимаетесь многозадачным программированием. Сегодня мы рассмотрим некоторые механизмы такого взаимодействия.
Получить консольный вывод дочернего процесса
Если вам нужно получить содержимое консоли запущенного дочернего процесса, то используйте функцию popen() библиотеки os. Хотя вы и встретите утверждение, что лучше для этих целей использовать модуль subprocess, у которого много разных возможностей, но в простых случаях и popen().
Простой пример использования функции popen() с чтением консоли запущенной программы.
Результат выполнения программы на моём компьютере
/home/vladislav/Yandex.Disk/Downloads:
2023-09-26-124011.jpg
image2.7z
image.7z
my_photo-133333.jpg
vlcsnap-2023-09-24-15h45m07s094.png
Надеюсь, этот результат вам понятен
При использовании popen() мы опустили параметр mode. По умолчанию он равен 'r', т.е. чтение из дочерней консоли. Но можно использовать и 'w'. Но мы не будем на этом останавливаться.
Послать сигнал дочернему процессу
Для посылки сигнала процессу, не обязательно дочернему, используется метод библиотеки os kill(). Сами предопределённые сигналы операционной системы являются просто целыми значениями. Например сигнал 14 это сигнал тревоги, сигнал 9 это немедленного прекращения работы процесса без всяких условий. Этот сигнал нельзя перехватить или заблокировать. Для управления сигналами в Python удобно использовать модуль signal. Мы вернёмся к этому модулю в одном из наших следующих статей. Здесь же мы приведём простой пример взаимодействия родительского сигнала с дочерним через сигналы. Метод kill() имеет два параметра. Первый параметр идентификатор процесса, второй целое число - сигнал.
В следующей программе ниже родительский процесс периодически посылает сигналы "тревоги" дочернему процессу, который сообщает о получение сигнала. В конце родительский процесс посылает сигнал уничтожения дочернего процесса.
Результат выполнения программы
В дочернем процессе
Передача сигналов 14
Сигнал тревоги
В дочернем процессе
В дочернем процессе
Передача сигналов 14
Сигнал тревоги
В дочернем процессе
Передача сигналов 14
Сигнал тревоги
В дочернем процессе
В дочернем процессе
Передача сигналов 14
Сигнал тревоги
Передача сигналов 9
Немедленное завершение дочернего процесса
Обратим внимание на строку
signal.signal(signal.SIGALRM, alarm)
Метод signal() модуля signal устанавливает обработчик указанного сигнала.
Таким образом мы установили одностороннюю связь между родительским процессом и дочерним процессом.
Может возникнуть вопрос: ну хорошо, это односторонняя связь через сигнал от родительского процесса к дочернему. А как осуществить двустороннюю связь? Здесь нет ничего сложного. Можно до того, как создавать дочерний процесс, получить идентификатор родительского процесса с помощью функции os.getpid(), присвоив его некоторой переменной. Тогда дочерний процесс получит также это значение и сможет отправлять сигналы родительскому процессу. Мы приведём такой пример в одной из следующих статей. А можно в дочернем процессе использовать функцию os.getppid() и сразу получить идентификатор родительского процесса.
Хорошего программирования. Оставляйте свои комментарии, не забывайте про лайки и подписывайтесь на мой канал programmer's notes.