Проще увидеть, что происходит, если вы также выводите идентификатор процесса (специальную переменную $$
) с каждым оператором say
:
use v5.10;
if( fork ) {
say "$$ (parent): if block";
} else {
say "$$ (child): else block";
}
Затем вы увидите, что вы получаете выходные данные издва разных процесса:
19997 (parent): if block
20024 (child): else block
Как правило, родительский процесс продолжается и делает свое дело, в то время как дочерний процесс продолжает и выполняет любую работу, которую вы хотели разгрузить.Однако дочерний объект наследует стандартные файловые дескрипторы родительского элемента, поэтому выходные данные отправляются в то же место.Если вы этого не хотите, вы можете немедленно изменить стандартный вывод (и другие) в дочернем (или, я думаю, родительском):
use v5.10;
if( fork ) {
say "$$ (parent): if block";
} else {
say "$$ (child): else block";
open STDOUT, ...
}
Если вы хотите, чтобы текущий процесс превратился во что-то другое (чтобы у вас все еще был только один процесс), посмотрите на exec .