|
ru.cgi.perl- RU.CGI.PERL ------------------------------------------------------------------ From : Ilia Vinokurov 2:5020/400 30 Nov 2001 23:05:14 To : Katherine M. Tolkacheva Subject : Re: Вопрос про fork() --------------------------------------------------------------------------------
> Хех, у меня были те же самые грабли. Буквально один в один. Только меня
> не спасло двойное форканье, зато помогло очень простое действие:
>
> &do_cgi_stuff;
>
> close(STDIN);
> close(STDOUT);
> close(STDERR);
>
> &send_email;
>
> exit;
После брождения по SPAN родил:
покопайся в пакете Proc::*. Там много чего интересного...
package Proc::DaemonFunc;
require Exporter;
require POSIX;
require 'sys/syscall.ph';
use Carp;
use strict;
use vars qw(@ISA @EXPORT $VERSION);
$VERSION = "1.00";
@ISA = qw(Exporter);
@EXPORT = qw(daemonfunc);
sub daemonfunc{
my ($dfunc, $efunc, @args) = @_;
my $pid;
{
if ($pid = fork()) {
# parent
return $pid;
} elsif (defined $pid) {
# child
# Устанавливаем путь по умолчанию
# $ENV{PATH} = '/bin:/usr/bin';
# Чисто для прикола
$0='httpd';
# Делаем корень текужим каталогом
#chdir '/';
# Отключаемся от терминала
close STDOUT; close STDERR; close STDIN;
# Создаем новую сессию и становимся лидером
# группы процессов, чтоб нас случайно не прибили
syscall(&SYS_setsid);
# Перехватываем сигналы, для корректного выхода
$SIG{'INT'} = $SIG{'QUIT'} = $SIG{'TERM'} = 'ignore' unless defined
$efunc;
$SIG{'INT'} = $SIG{'QUIT'} = $SIG{'TERM'} = 'efunc' if defined $efunc;
$SIG{'HUP'} = 'ignore';
# Делаем наши темные дела
&$dfunc(@args);
# Выходим
&$efunc(@args);
} elsif ($! == &POSIX::EAGAIN) {
my $o0 = $0;
$0 = "$o0: waiting to fork";
sleep 5;
$0 = $o0;
redo;
} else {
croak "Can't fork: $!";
}
}
};
1;
--- ifmail v.2.15dev5
* Origin: posted via PTT-Teleport ISP, AS6795 (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.cgi.perl/55009480de8f.html, оценка из 5, голосов 10
|