Lev Serebryakov wrote:
> Eugene B. Berdnikov писал к Lev Serebryakov:
> >> Как сказать, чтобы по завершению скрипта не ждал детей? То есть
> >> "fork", и родителю надо _сразу_же_ выйти. Такое впечатление, что
> >> ждет...
> EB> И это правильно. Hадо 2 вложенных fork'а. Изучайте идеологию UNIX.
Во-первых, не ждет. Запустите тестовый скрипт и убедитесь:
---------------------- test.pl ----------------------------
#!/usr/bin/perl
if(!fork) {
my $was=getppid;
sleep 10;
my $now=getppid;
print "Hello from child. My parent was $was and now $now\n";
} else {
sleep 1;
}
------------------------- EOF -----------------------------
$ ./test.pl
$ Hello from child. My parent was 16683 and now 1
Заметьте, что промпт появляется через секунду. А приветствие, через 10.
Во-вторых, не надо двух форков. Хотя идеологию изучать никогда не вредно :-)
она тут ни при чем. Причена ожидания, скорее всего, в Вашей ошибке.
> Это как, два вложенных? Если ждет - то какой толк? Hовый "родитель" второго
> уровня будет ждать "ребенка", а первый "родитель" - "родителя" второго уровня
> (своего "ребенка"). в man fork про ожидание ничего не сказано, но вот из "man
> wait":
> If a parent process terminates without waiting for all of its child pro-
> cesses to terminate, the remaining child processes are assigned the par-
> ent process 1 ID (the init process ID).
Абсолютно верно.
> Где здесь сказано, что родитель ждет? Родитель спокойно выходит... И все
> детишки переходят к init'у. И у Робачевского тоже самое сказано.
> Да, в описании Perl'ового fork'а сказано "There's also the double-fork trick".
> Hо я, если честно, не понял его смысла. Объясни, пожалуйста.
Объясняю. Смысл этого трюка, создать потомка "оторванного" от родителя. В
примере:
unless ($pid = fork) {
unless (fork) {
exec "what you really wanna do";
die "no exec";
# ... or ...
## (some_perl_code_here)
exit 0;
}
exit 0;
}
waitpid($pid,0);
первый форк, дает нам "отца" и "сына". отец тут же принимается ждать смерти
"сына".
"сын" тем временем "рожает" "внука", после чего "умирает". Сирота-"внук"
получает в
приемные родители процесс с pid-ом 1. "Отец" дождавшись "смерти" "сына"
продолжает
деятельность освободившись от родительских обязанностей. "Внук" живет сам по
себе с
приемным отцом (ну чем не "демон"? :-)).
С уважением, Андрей Сапожников.
-- end of forwarded message --
-- С тем, что не помешает никогда, Kittle