Birden fazla istemcide kullanılan dosyaları kilitlemek için flock () / BSD kilitlerini kullanmaya çalışıyorum, ancak dosyalar bozuldu. Nasıl olur? A. flock () / BSD kilitleri 2.6.12'den önce yalnızca Linux NFS istemcileri üzerinde yerel olarak çalışır. Dosya kilitlerinin diğer istemciler tarafından görülmesini sağlamak için fcntl () / POSIX kilitlerini kullanın.
NFS dosyasına erişimi serileştirmenin bazı yolları.
Fcntl () / POSIX kilitleme API'sini kullanın. Bu tür kilitleme, NLM protokolü veya NFSv4 aracılığıyla birden çok istemcide bayt aralığı kilitleme sağlar. Ayrı bir kilit dosyası kullanın ve bu dosyaya sabit bağlantılar oluşturun. Creat (2) kılavuz sayfasının O_EXCL bölümündeki açıklamaya bakın. 2.6 çekirdeklere kadar, O_EXCL oluşturucularının Linux NFS istemcilerinde atomik olmadığını belirtmek gerekir. 2.6.5'ten daha yeni bir çekirdek çalıştırmıyorsanız, O_EXCL oluşturma ve birden çok NFS istemcisi arasında atom davranışı beklemeyin.
Perl'in varsayılan olarak flock () / BSD kilitleme kullanması bilinen bir sorundur. Bu, flok / BSD kilitlerinin POSIX kilitleri gibi çalışmasını bekleyen Solaris gibi diğer işletim sistemlerinden taşınan programları kırabilir.
Linux'ta, sabit bağlantı yerine dosya kilitleme kullanmanın, istemcinin önbelleğini sunucu ile işaretlemenin ek bir yararı vardır. Bir dosya kilidi alındığında, istemci bu dosya için sayfa önbelleğini temizler, böylece sonraki okumalar sunucudan yeni veriler alır. Bir dosya kilidi bırakıldığında, o istemcideki dosyada yapılan herhangi bir değişiklik, kilit açılmadan önce sunucuda temizlenir, böylece o dosyayı kilitlemeyi bekleyen diğer istemciler değişiklikleri görebilir.
2.6.12'deki NFS istemcisi, BSD tarzı kilitleri POSIX bayt aralığı kilitleri açısından taklit ederek NFS dosyalarında flock () / BSD kilitleri için destek sağlar. Aynı öykünme mekanizmasını kullanan veya fcntl () / POSIX kilitlerini kullanan diğer NFS istemcileri, Linux NFS istemcisinin gördüğü kilitleri görür.
Yerel Linux dosya sistemlerinde POSIX kilitleri ve BSD kilitleri birbirlerine görünmezdir. Bu nedenle, bu öykünme nedeniyle, bir Linux NFS sunucusunda çalışan uygulamalar, istemcideki uygulama bir BSD stili veya POSIX kullanıyor olsa da, NFS istemcileri tarafından kilitlenen dosyaların fcntl () / POSIX kilidi ile kilitli olduğunu görmeye devam eder. tarzı kilit. Sunucu uygulaması flock () BSD kilitlerini kullanıyorsa, NFS istemcilerinin kullandığı kilitleri görmez.