|
|
ru.perl- RU.PERL ---------------------------------------------------------------------- From : vilfred 2:5020/400 10 Mar 2003 14:25:51 To : Sergey Prozhogin Subject : ответ про fork() --------------------------------------------------------------------------------
Привет!
Hужно объявить переменную, которая видна и может
быть изменяема в нескольких процессах,
use IPC::Shareable;
$mn = tie $buff, 'IPC::Shareable', undef, {destroy
=> 1};
$mn->shlock(); $buff=$$; $mn->shunlock();
за это я люблю перл :)
Вот скрипт котороый через эту переменную(её пид)
убивает процесс-потомок:
#!/usr/bin/perl -w
use Symbol;
use POSIX;
use Socket;
use IO::Socket;
use IO::Handle;
use Net::Ping;
use IPC::Shareable;
use Fcntl ':flock';
$lockf="x.txt";
open LOCK, ">$lockf";
unless (flock(LOCK,LOCK_EX|LOCK_NB)){
print "÷ÎÉÍÁÎÉÅ!
ïÂÎÁÒÕÖÅÎ
ÄÒÕÇÏÊ
ÒÁÂÏÔÁÀÝÉÊ
ÓÅÒ×ÅÒ.\n";
goto end
}
$mn = tie $buff, 'IPC::Shareable', undef, {destroy
=> 1};
#$host='212.152.36.162';
$host='212.192.250.155';
$port=1234;
$PREFORK =1; %children=(); $children=0;
my ($kidpid, $handle, $line);
my $a='/mnt/work/net.txt';
make_new_child() for(1 .. $PREFORK); #ÄÅÌÁÀ
1-ÇÏ
ÐÏÔÏÍËÁ
$SIG{CHLD}=\&REAPER; $SIG{INT}=\&HUNTSMAN;
while(1){
sleep;
for($i=$children; $i<$PREFORK;
$i++){make_new_child()}
}
sub make_new_child{
my ($pid,$sigset);
$sigset=POSIX::SigSet->new(SIGINT);
sigprocmask(SIG_BLOCK, $sigset) or die "can't
block SIGINT for fork: $!\n";
die "fork: $!" unless defined($pid = fork);
if($pid){ #ÐÒÏÃÅÓÓ
ÒÏÄÉÔÅÌØ
$mn->shlock(); $buff=$$; $mn->shunlock();
sigprocmask(SIG_UNBLOCK, $sigset) or die
"can't unblock SIGINT for fork: $!\n";
$children{$pid}=1; $children++;
print "$$ - papa\n";
&ping_serv($pid); # ÐÉÎÇÕÀ
ÕÄÁÌÅÎÎÙÊ
ÓÅÒ×ÅÒ
return;
} else { #ÐÒÏÃÅÓÓ
ÐÏÔÏÍÏË, ÞÉÔÁÀ
ÉÚ ÓÏËÅÔÁ
$SIG{INT}='DEFAULT'; #$SIG{CHLD}='IGNORE';
sigprocmask(SIG_UNBLOCK, $sigset) or die
"can't unblock SIGINT for fork: $!\n";
print "$$ - dite\n";
&read_socket(); #ÞÉÔÁÀ ÉÚ
ÓÏËÅÔÁ
kill 'QUIT' => $buff or die "can't kill: $!";
exec($0) or die "can't exec: $!";
exit;
}
}
sub HUNTSMAN{ #×ÙÈÏÄ ÐÏ ctrl^C
local($SIG{CHLD})='IGNORE';
kill 'INT' => keys %children;
exit;
}
sub REAPER{ #ÕÂÉÔØ
ÞÁÊÌÄÁ ÞÔÏÂÙ ×
ÄÁÌØÎÅÊÛÅÍ
ÅÇÏ
ÐÅÒÅÚÁÐÕÓÔÉÔØ
$SIG{CHLD}=\&REAPER;
my $pid = wait;
$children--;
delete $children{$pid};
}
sub ping_serv{ #ÐÉÎÇÕÀ
ÓÅÒ×ÅÒ
$p = Net::Ping->new();
$p->hires();
my $interrupted = 0;
$SIG{ALRM}= sub{die "timeout"};
eval{ while(1){ alarm(40);
(undef, undef, undef) = $p->ping($host, 40);
alarm(0);
sleep(1);
}
};
if($@ and $@=~/timeout/){
print "$host ÎÅ
ÐÉÎÇÕÅÔÓÑ,
ÐÅÒÅÚÁÐÕÓË $_[0]\n";
open F, ">$a"; print F " "; close F; qx[chmod
777 $a];
kill 'QUIT' => $_[0];
} else { die }
$p->close();
}
sub read_socket{
my $cc=9;
begin: sleep 5;
$handle = IO::Socket::INET->new( PeerAddr => $host,
PeerPort => $port,
Proto => "tcp");
if(!$handle){print "öÄÅÍ
ÎÁÞÁÌÁ ÒÁÂÏÔÙ
ÓÏËÅÔÁ
$port ÎÁ ÓÅÒ×ÅÒÅ $host\n";
$cc++;
do{print "$cc\n"; open F, ">$a"; print F " ";
close F; qx[chmod 777 $a];} if
$cc%10==0;
goto begin} else {
$handle->autoflush(1);
print STDERR
"[ÓÏÅÄÉÎÅÎÉÅ Ó
$host:$port]\n";
while(defined($line = <$handle>)){
$c=1 if $line=~m!PKT INFO:!sm;
$rr.=$line if $c==1;
do{$c=0; &data($rr); $rr=''} if
$line=~m!===END===!sm;
}
}
sub data(){ $x=$_[0];
$date=qx[date];
open F, ">>test.log";
print F $date;
print F $x;
close F; print STDOUT $date;
print STDOUT $x;
if($x!~m!\sType= 44,\s!sg){
open FF, ">grrrrb.txt"; print FF $x; close FF;
qx[./alert.pl grrrrb.txt &];
}
}
}
end:
flock(LOCK,LOCK_UN);
close LOCK;
Дима
--
TEAM [Маньяки]
Отправлено через сервер Форумы@mail.ru - http://talk.mail.ru
--- ifmail v.2.15dev5
* Origin: Talk.ru (2:5020/400)
Вернуться к списку тем, сортированных по: возрастание даты уменьшение даты тема автор
Архивное /ru.perl/6488bb499fe1.html, оценка из 5, голосов 10
|