[Cascavel-pm] NFS x flock
Breno G. de Oliveira
breno em clavis.com.br
Quinta Fevereiro 9 15:46:58 PST 2006
Rod Za wrote:
>
> O que fiz foi simplesmente criar um arquivo com terminação .lock e verificar se este arquivo
> existe. Existindo significa que outro processo já está rodando, não existindo é então criado
> este arquivo (para que outro processo não rode).
>
> Coisa simples e que substitui o que vc precisa. Lógicamente irá substituir se vc depender
> somente de seu código! :)
>
O único problema com arquivos de locking é a questão da concorrência
entre processos. Imaginem o seguinte programa:
------------------8<------------------
if(! -e $lockfile)
{
open(LOCK, '>', $lockfile) or die $!;
close(LOCK);
# (...) Regiao Critica do meu programa
}
unlink($lockfile)
------------------8<------------------
O programa aparentemente é seguro para essa RC, mas imaginem o seguinte
cenário hipotético:
Duas instâncias desse programa, A e B, estão sendo executadas ao mesmo
tempo em um sistema multiprogramado (ou seja, com escalonamento de
processos).
O processo A executa o trecho "if(! -e $lockfile)" e, como não existe o
arquivo, ele entra no laço. Só que antes de executar a instrução
seguinte, ele é escalonado e dá lugar para o outro processo, o B.
Esse, por sua vez, executa o trecho "if(! -e $lockfile)" e, como AINDA
não existe o arquivo, ele *também* entra no laço. Ele então cria o
arquivo e continua seu processamento até também ser escalonado, dando
lugar de volta para o processo A.
Como o processo A já executou o "if", ele simplesmente continua dali e
abre o arquivo de lock como se nada tivesse acontecido (dessa vez
simplesmente sobrescrevendo-o, e não criando).
Como é apenas uma linha de diferença (embora em termos de ciclos de
máquina seja bem mais) é difícil esperar que uma situação dessas
aconteça com frequência, mas se esquecermos dela alguns problemas
inesperados podem acontecer quando o caso hipotético acontecer e não
saberemos pq.
Enfim, sem polêmicas ;) É apenas um preço que pagamos pela
portabilidade, ninguém perde (muito) o sono por causa disso)
[]s,
breno
Mais detalhes sobre a lista de discussão Cascavel-pm