Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Perl: Общие вопросы > Параллельность выполнения процессов после fork()


Автор: bonger 10.3.2011, 22:56
Нашел следующий линк http://hell.jedicoder.net/?p=82, где в качестве примера приведен код:

Код

my $pid = fork();
if (not defined $pid) {
print "resources not avilable.\n";
} elsif ($pid == 0) {
print "IM THE CHILD\n";
sleep (5);
print "IM THE CHILD2\n";
exit(0);
} else {
print "IM THE PARENT\n";
waitpid($pid,0);
}
print "HIYA\n";


И ожидаемый результат работы:

IM THE CHILD
IM THE PARENT
                        - sleep for 5 seconds -
IM THE CHILD2
HIYA

Что вижу я (ActiveState Perl, Win 7 x64):

C:\pl>pl2.pl
IM THE PARENT
IM THE CHILD
                       - спим указанные 5 секунд -
IM THE CHILD2
HIYA

Дополнительная секундная задержка делает вывод как у автора.

Код

sleep(1); 
print "IM THE PARENT\n"; 



Ну и собственно вопрос - в чем и где тут хитрость? Чего то я не понимаю? Или настройки интерпретатора, сама ос...

Автор: Pfailed 11.3.2011, 08:36
Не определён здесь порядок вывода, может первым как parent напечатать, так  и child, как повезёт. Но более логично, что parent успеет напечатать первым, потому как для инициализации дочернего процесса затрачивается какое-то время.
Второе на что нужно обратить внимание, это то, что в windows отсутствует системный вызов fork и perl эмулирует его через потоки. Таким образом на адекватную работу можно только надеяться. Например fork бомба 
Код

fork while fork
 в windows не взрывается smile 

Автор: arto 11.3.2011, 08:37
сама ос

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)