2014-11-28 2 views
-1

Когда я бегуПочему не fork() не дает правильный pid сразу?

#!/usr/bin/perl 
my $pid; 
if ($pid = fork) { 
    system("sleep 100"); 
} 
print "pid $pid\n"; 

тогда я получаю

pid 0 

и когда он выходит

pid 17613 

В то время как он работает, я могу видеть, дочерний процесс идентификаторами

jasl  17612 17036 0 14:05 pts/2 00:00:00 /usr/bin/perl ./fork.pl 
jasl  17613 17612 0 14:05 pts/2 00:00:00 [fork.pl] <defunct> 
jasl  17614 17612 0 14:05 pts/2 00:00:00 sleep 100 

Вопрос

Почему я получаю pid 0 (вилка успеха), а затем, когда он выходит правильный pid 17613? Как будто линия print выполняется дважды?

Есть ли способ получить PID команды sleep из скрипта perl?

+2

'if ($ pid = fork)' –

ответ

3

как будто строка печати выполняется дважды?

Я рекомендую вам сначала узнать, что делает fork(), прежде чем использовать его. Тогда вы поймете, почему строка выполняется дважды.

Вкратце: fork создает копию текущего процесса, и с этого момента оба процесса запускают остальную часть кода. Одно из главных отличий заключается в том, что код возврата от ребенка равен 0, а родительскому - pid ребенка.

2

Вилка возвращает другой PID для обоих процессов. Родительский процесс получает PID дочернего элемента и возвращает 0 дочернему процессу. Поэтому причина, по которой вы видите два отпечатка, состоит в том, что оба процесса печатают значение, которое им было возвращено.

Смежные вопросы