Отвечая на два ваших вопроса:
что активирует звонок на счетчик?проверяют ли новые процессы свои pid, и если он равен нулю, то вызов счетчика?
Да.os.fork()
- необычный зверь в том смысле, что он «нарушает законы физики»: он возвращает дважды в двух отдельных процессах.Эти два процесса (почти) идентичны, поэтому только способ узнать, кем вы являетесь (родительским или дочерним), это посмотреть, что вернул os.fork()
: если он вернул ноль, вы - ребенокв противном случае возвращаемое значение - это pid дочернего элемента.
Поскольку оба процесса выполняют строку if pid != 0
, будет выполняться тот, где pid равен ноль (то есть дочерний)блок else
, который будет вызывать counter
.
Если я изменю время ожидания на 1 секунду (вместо десятых мил), то данные для дочерних процессов не выводятся.Что происходит в фоновом режиме?
Вы не wait
для своих детей.Это означает, что, как только родительский процесс завершается, он «теряет» все свои дочерние процессы.init
охотно примет их, но они могут потерять доступ к своему управляющему терминалу в процессе, и одного этого может быть достаточно, чтобы убить их.Кроме того, в современной системе Linux systemd
, скорее всего, убьет детей, если вы не сказали иначе.
Как правило, если вы используете fork
, вам также необходимо wait
.Родитель получает pid ребенка, который был разветвлен, чтобы он мог вызвать wait
на этом pid.Это служит двум целям: во-первых, он фактически ожидает выполнения дочернего процесса, а во-вторых, он позволит родителю получить код выхода от ребенка, который позволит вам узнать, успешно ли завершился дочерний процесс или он был убит,Если вы не ждете, нет 100% надежного способа узнать, что случилось с ребенком.(Даже если вы спрятали pid где-то еще, возможно, что pid может быть использован повторно, прежде чем вы сможете снова проверить.)
В танце fork
/ (* есть много тонкостей)* тысяча тридцать семь) / * * тысяча тридцать восемь;в их простоте есть элегантность, но если вы дотрагиваетесь до этих инструментов, существует много предполагаемых знаний.Не ожидайте, что сможете эффективно использовать fork
, если вы не прочитали каких-либо руководств по нему.И если вы не хотите становиться экспертом по модели процессов Unix (и таким вещам, как обработка сигналов, управление терминалами и лидерами сеансов и т. Д.), То вам гораздо лучше использовать абстракцию более высокого уровня, чтобы скорее решить проблемучем дурачиться с вещами низкого уровня, как это.Для этого Python предлагает модуль multiprocessing
, который является гораздо лучшим инструментом общего назначения.