|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : Andrey Brindeew 2:5020/400 04 Dec 2000 00:14:24 To : All Subject : Re: fork -------------------------------------------------------------------------------- "Edward Muhutdinov" <Edward.Muhutdinov@p13.f89.n5049.z2.fidonet.org> wrote: > Возникла проблема с fork. Ситуация такая - в перловом скрипте в середине > процесса форкается несколько процедур. Встречный вопрос - зачем форкаемся? Если затем, чтобы после отдачи клиенту сообщения "Работа запущена, ждем-с результаты..." продолжить что-то делать (например, рассылку или еще чего критичное ко времени), то тебе нужно отделиться нафик от родителя, которому скоро суждено сдохнуть. Вот кусок из моего тестового скрипта на эту тему: use strict; use POSIX 'setsid'; use CGI; my $q = CGI->new(); if (my $pid = fork) { print $q->header(), $q->start_html('We are forked!'), 'Successfully forked!', $q->end_html(); sleep 5; } else { die "Can't fork: $!" unless defined $pid; open STDIN, '/dev/null' or die "Can't read /dev/null: $!"; open STDOUT, '>/dev/null' or die "Can't write to /dev/null: $!"; setsid or die "Can't start a new session: $!"; open STDERR, '>&STDOUT' or die "Can't dup stdout: $!"; sleep 10; my $a = `touch /tmp/tst/a`; exit 0; } Ключевым здесь является закрытие STDIN, STDOUT & STDERR, наследуемых от родителя и использование POSIX-функции setsid. Про setsid расскажут в документе 'man 2 setsid'. По крайней мере на Linux. :) -- WBR, Andrey Brindeew "No one person can understand Perl culture completely" (C) Larry Wall. --- ifmail v.2.15dev5 * Origin: Dportal.Ru (2:5020/400) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/7502770da57a.html, оценка из 5, голосов 10
|