Главная страница


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)
 
 

Вернуться к списку тем, сортированных по: возрастание даты  уменьшение даты  тема  автор 

 Тема:    Автор:    Дата:  
 вопрос про fork()   Sergey Prozhogin   08 Mar 2003 23:19:58 
 Re: вопрос про fork()   Ivan Frolcov   09 Mar 2003 11:47:59 
 вопрос про fork()   Ruslan Sulemanov   09 Mar 2003 23:48:30 
 ответ про fork()   vilfred   10 Mar 2003 14:25:51 
Архивное /ru.perl/6488bb499fe1.html, оценка 3 из 5, голосов 10
Яндекс.Метрика
Valid HTML 4.01 Transitional