[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