[Cascavel-pm] uso de flock

Flavio S. Glock fglock em pucrs.br
Terça Julho 8 09:10:16 CDT 2003


Luis Campos de Carvalho wrote:
> 
> Alceu Rodrigues de Freitas Junior wrote:
> > On Fri, 04 Jul 2003 17:34:47 -0300
> > Luis Campos de Carvalho <lechamps em terra.com.br> wrote:
> >
> >>   Pode parecer bobagem, mas você precisa executar o flock() antes de
> >>abrir o arquivo...
> >
> > Antes? Os exemplos que eu vi dizem para abrir o um descritor
>  > de arquivos e depois usar flock nele... pelo menos faz sentido...
> 
>    Oops. Escrevi bobagem. Os exemplos (e você) têm razão: a gente usa o
> flock em um file descriptor aberto. =-] Desculpe...
> 
> >>   Não existe garantia de honrar o bloqueio por parte do S.O.
> >>   Os processos que forem sobreescrever o artigo e não usarem flock()
> >>podem conseguir.
> >
> >
> > Ahn, que beleza. :-| Simplesmente não vou poder fazer isso.
> >
> >
> >>>system(echo 'teste' > arquivo);
> >>
> >>   o "echo" e o $SHELL não respeitam flock().
> >>   Cuidado.
> >
> >
> > Acho que vou fazer o CGI criar um arquivo de lock, e usar flock nele. Assim ele roda o processo apenas se esse arquivo estiver liberado para leitura.Se estiver, ele roda o comando. Se não estiver, ele espera por algum tempo, até conseguir acesso ao arquivo de lock ou estourar o tempo de timeout, o que ocorrer primeiro.
> >
> > Faz sentido usar tal estratégia?
> 
>    A melhor estratégia de uso do flock() sempre envolve você ter algumas
> garantias externas. Acho que a melhor delas é garantir que não existem
> outros processos que podem acessar o arquivo flock'ed enquanto você está
>   rodando seu sistema de produção...
> 
>    Assim, o lock sempre será respeitado, pois todos os processos que se
> interessam pelo arquivo usam e respeitam o flock().
> 
>    Outra boa estratégia pode ser executar flock() em um arquivo vazio,
> que serve como referência para saber quem usa os arquivos de dados
> agora, e tentar fazer as transações no arquivo de dados atômicas, usando
> unlink e /bin/mv para sobrescrever o arquivo.
> 
>    Flávio, você saberia indicar um módulo Perl para ajudar?

No CPAN tem vários:

  IO::AtomicFile 
  write a file which is updated atomically 

  File::Transaction::Atomic 
  atomic change to a group of files 

  LockFile::Simple 
  simple file locking scheme 

Eu tive muitos problemas com Windows - através da rede, mesmo se
você renomeia um arquivo, um outro computador ainda pode acessar
o arquivo usando o nome antigo, por um certo tempo!

Qualquer módulo que você escolher - é importante testar muito
bem para ver se funciona no seu sistema operacional!

- Flavio S. Glock



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