(fwd) Re: Пара вопросов по Perl.

Andrey Gerzhov (kittle@freeland.alex-ua.com)
Sun, 18 Apr 1999 14:38:07 +0300 (EEST)

-- forwarded message --
Path: freeland.alex-ua.com!routki.ki.yurteh.net!carrier.kiev.ua!srcc!Gamma.RU!ddt.demos.su!not-for-mail
From: "Andrew B. Sapozhnikov" <sapa@hq.icb.chel.su>
Newsgroups: fido7.ru.unix
Subject: Re: Пара вопросов по Perl.
Date: 15 Apr 1999 19:49:31 +0400
Organization: ICB
Lines: 68
Sender: fido7@ddt.demos.su
Approved: <gateway@fido7.ru>
Message-ID: <37160BEC.361BA3A0@hq.icb.chel.su>
References: <1661337256@ddt.demos.su> <924136916@f661.n5030.z2.ftn>
NNTP-Posting-Host: ddt.demos.su
Mime-Version: 1.0
Content-Type: text/plain; charset=koi8-r; language=ru
Content-Transfer-Encoding: 8bit
X-Trace: ddt.demos.su 924191372 406 194.87.13.37 (15 Apr 1999 15:49:32 GMT)
X-Complaints-To: gatekeeper@fido7.ru
NNTP-Posting-Date: 15 Apr 1999 15:49:32 GMT
X-BeforeModerator-Path: usenet
X-BeforeModerator-NNTP-Posting-Host: charon.hq.icb.chel.su
X-Mailer: Mozilla 4.51 [en] (X11; I; Linux 2.2.4 i586)
X-Accept-Language: ru,en-US
Xref: freeland.alex-ua.com fido7.ru.unix:5796

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