[Cascavel-pm] Controle de processo em perl

Igor Sutton Lopes igor.sutton em gmail.com
Sexta Abril 6 08:23:08 PDT 2007


Olá Kleber,

On 2007/04/06, at 14:38, KLEBER wrote:

> Olá  Igor ,
>
> Agradeço sua gentileza em me responder.
>
> Entendi suas considerações e devo te dizer que não sou um especialista
> em perl ( conheço com alguma profundidade cobol )
> O pouco que conheço , aprendi lendo o livro Perl como programar  
> ( deitel ).
> Sobre o tema controle de processo , estava imaginando controlá-lo ,  
> não
> através de arquivo , mas pelo PID.
> ( me desculpe se estou falando bobagem ).

Pelo que me recordo da sua mensagem inicial, você queria utilizar um  
controle de processos relacionado ao filehandle, isto é, não permitir  
que dois processos concorrentes modifiquem o mesmo arquivo, ao mesmo  
tempo. Isto você consegue com flock(), conforme você o fez e eu  
enviei uma abordagem mais perlish.

Agora, se você quer controlar processos concorrentes através de fork 
() e wait(), é um pouco diferente.

>
> De acordo com o livro mencionado , o pid está na variável  $PROCESS_ID
> e existe uma função chamada WAIT( )  que aguarda o término de um  
> processo.
> A minha necessidade seria resolvida formulando a seguinte indagação :
>
> ENQUANTO $PROCESS_ID  ESTIVER  ATIVO WAIT( )

A pergunta que fica é: você que está iniciando estes processos  
concorrentes, ou o sistema operacional?

Ah, em relação à variável $PROCESS_ID, você precisa utilizar 'use  
English;' no início do seu programa (perldoc English para maiores  
informações).

>
> Não sei se é possível este tipo de contole em perl e , se for , como
> codificá-lo.
> 
> Nota - Consta as seguintes informações neste livro :
>             a) Na variável especial  $PID   consta o numero do  
> processo do
>                 próprio programa.
>             b) Se quiser esperar que termine a execução de processo
> específico ,
>                 você pode usar a função WAITPID , que recebe um  
> processo
>                 como primeiro argumento.Ela espera que aquele processo
> termine
>                 e então devolve o pid daquele processo.
>                 Se não houver nenhum filho para aquele pid ou se já  
> estiver
> morto ,
>                 a função WAITPID devolve -1.
>                 O estado de saida do processo filho é armazenada na  
> variável
>                 especial  $?.
>             c) Exemplo de controle de processo no livro ( dois  
> processos ) :
>                 my ( $pid, $pid2 );
>                 s| = 1;
>                 if (  ( $pid = fork()  ) && ( $pid2 = fork() ) ) {
>                       print ( "Preciso esperar meus filhos.\n" );
>                       my $straggler = wait();
>                      print ( "Finalmente $straggler terminou.Agora  
> eu posso
> ir.\n" );
>                 }
>                 elsif ( $pid && defined(  $pid2 ) ) {
>                         sleep( 2 );
>                         print( "Filho 2 : O meu tambem....\n" );
>                         sleep( 4 );
>                         exit ();
>               }
>                elsif ( defined( $pid ) ) {
>                         sleep( 1 );
>                        print( "Filho 1 : Meu pai tem paciencia...... 
> \n" );
>                        sleep( 2 );
>               }
>               else {
>                   die(  "Problemas com fork " );
>               }
>
>              Acredito que neste programa exemplo esteja a solução  
> do meu
>              problema , entretanto , pôr não dominar o perl , não  
> sinto
>              segurança para interpletá-lo.
>
> Mais uma vez , agradeço a sua atenção ,

Certo, vamos lá com um exemplo de fork():

<code>
use strict;
use warnings;

use POSIX qw(:sys_wait_h);

sub message {
     print "[$$] ", @_, $/;
}

sub REAPER {
     while ( ( my $child = waitpid( -1, WNOHANG ) ) > 0 ) {
         message( "filho $child morreu", $/ );
     }
     $SIG{CHLD} = \&REAPER;
}
$SIG{CHLD} = \&REAPER;

my $pid = fork();
unless ( defined $pid ) {
     die "problemas ao executar fork(): $!";
}

if ( $pid > 0 ) {    # estamos no processo pai
     message( "iniciei o processo $pid", $/ );
     sleep 5;
     message( "pai esta saindo", $/ );
exit;
}
else {               # estamos no processo filho
     message( "eu sou o filho!", $/ );
     exit;
}

</code>

Para maiores informações:

perldoc perlipc
perldoc POSIX
perldoc -f fork

A propósito: o que é que você quer fazer, afinal? Descreva-nos o seu  
problema, assim fica mais fácil de ajudá-lo :-)

Abraço!

--
Igor Sutton
igor.sutton em gmail.com



-------------- Próxima Parte ----------
Um anexo em HTML foi limpo...
URL: http://mail.pm.org/pipermail/cascavel-pm/attachments/20070406/a214bc86/attachment-0001.html 
-------------- Próxima Parte ----------
Um anexo não texto foi limpo...
Nome  : PGP.sig
Tipo  : application/pgp-signature
Tam   : 186 bytes
Descr.: This is a digitally signed message part
Url   : http://mail.pm.org/pipermail/cascavel-pm/attachments/20070406/a214bc86/attachment-0001.bin 


Mais detalhes sobre a lista de discussão Cascavel-pm