|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Yuriy Kaminskiy 2:5020/517.21 22 Nov 2001 20:14:45 To : Igor Sysoev Subject : Re: Re: Вопрос про fork() -------------------------------------------------------------------------------- >>>>> On 16:12 21/11/2001, is@rambler-co.ru writes: >> Все работает отлично: скрипт говорит "Рассылка в процессе..." и >> рассылает почту. Hо при этом броузер держит соединение с >> веб-сервером и заканчивает соединение только после того как скрипт >> закончит рассылку писем. >> Как бы сделать, что после вывода "Рассылка в процессе..." броузер >> сразу бы закрывал соединение? IS> Hужно делать два форка для того, чтобы процесс демонизировался: Хрр. Двойной форк нужен 1. для использования setsid [чтобы отсоедениться от управляющего терминала; второй fork нужен, чтобы открытие tty не сделало его управляющим терминалом; в данном случае это неактуально] 2. чтобы избавиться от zombie. В случае классического cgi это также неактуально - потому как "рабочий" процесс и так является "внуком" httpd, а его родитель завершает работу. В действительности HЕОБХОДИМО закртыть STDIN/STDOUT (все остальное - для пущей полноты). Итого, исправленное решение: use File::Spec (); use IO::Handle (); use POSIX qw/setsid/; STDOUT->flush; # just in case... STDERR->flush; IS> if (!fork) { open(STDIN, File::Spec->devnull); open(STDOUT, ">".File::Spec->devnull); setsid; IS> if (!fork) { IS> # работа IS> } else { IS> exit 0; IS> } IS> } else { IS> wait; print; IS> } -- Yuriy Kaminskiy. PS perldoc perlipc, аднака. --- Gnus/5.0808 (Gnus v5.8.8) XEmacs/21.1 (Cuyahoga Valley) * Origin: none (2:5020/517.21@fidonet) Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/1742796a42ef7.html, оценка из 5, голосов 10
|