2010-01-11 16 views
8

İki dosya adını bağımsız değişken olarak kabul eden bir programım var: ikinci dosyayı oluşturmak için ilk dosyayı okur. Programın ilk dosyanın üzerine yazmamasını nasıl sağlayabilirim?İki dosya adının aynı fiziksel dosyaya işaret edip etmediğini denetleme

Kısıtlamalar:

  • (yumuşak veya sert) dosya sistemi destekleri
  • Dosya izinleri sabittir ve sadece ilk dosya okunabilir ve ikinci dosya olması gerekmektedir bağlantılar da çalışmaya devam edilmelidir yöntem
  • tercihen, platformdan bağımsız olmalıdır yazılabilir
+8

UNIX ve Linux felsefesinde böyle bir programa filtre denir. Genellikle standart girişten (STDIN) okur ve standart çıktıya (STDOUT) yazar. Bu, arayanlara bu tür doğrulamaların sorumluluğunu ortadan kaldırdığı için bu tür programların yazılmasını kolaylaştırır. Programınız işini yapmaya konsantre olabilir. –

cevap

12

Linux üzerinde, her iki dosyayı da açın ve st_ino (düzenleme :) ile st_dev öğesinin aynı olup olmadığını kontrol etmek için fstat kullanın. open sembolik bağlantıları takip edecektir. Yarış koşullarını önlemek için doğrudan stat kullanmayın.

+4

Yarış koşulu, dosya durumunun stat (2) ile açık (2) arasında değişebileceği anlamına gelir. Stat yaparsınız ve sonra bazı kullanıcılar az önce belirttiğiniz dosyayı açar ve ikinci dosyanızı açmak üzere olduğunuz ikinci dosyaya bağlar (2). Sadece bir açıklama. –

+7

Ayrıca, "st_dev" alanlarının eşleştiğinden emin olun. İki farklı ciltte farklı dosyaların aynı inode numarasına sahip olmasını engelleyen hiçbir şey yoktur. –

3

mümkünse, ilk dosya açılır (Linux birincil hedef olmasına rağmen), salt okunur (O_RDONLY) LINUX içinde. Sonra, tekrar yazmak için tekrar açmaya çalışırsanız, bir hata alırsınız.

+0

İkinci dosya zaten başka bir işlem tarafından salt okunursa, yanlış pozitif alırsınız. Evrensel çözümün mümkün olduğundan bile emin değilim (dosya kimlikleri almak gibi dosya sistemine özgü özelliklere başvurmalısınız). – Costique

9

En iyi bahis, dosya isimlerini kimlik olarak kullanmak değildir. Bunun yerine, dosyayı açmak için açtığınızda, işletim sisteminizin desteklediği herhangi bir mekanizmayı kullanarak kilitleyin. Daha sonra dosyayı açmak için açtığınızda, ayrıca kilitleyin - kilitleme başarısız olursa, bir hata bildirin.

+0

Çok unixy değil, çoğu platformda çalışacak güzel meta mantığı, – dmckee

0

Dosya durumunu almak için stat'u kullanabilir ve inode numaralarının aynı olup olmadığını kontrol edebilirsiniz.

-1

Bazı kabuk komutlarını çağırmak için sistem() işlevini kullanabilirsiniz.

bash ise, sadece çağırır:

stat -c %i filename 

Bu dosyanın inode sayısını gösterir. İki dosyayı bu şekilde karşılaştırabilirsiniz ve eğer inode'ları birbirinin aynı ise, bunlar sabit bağlantılar demektir. Aşağıdaki çağrı:

stat -c %N filename 

dosyanın adını görüntüler ve bir sembolik bağ ise, bunun yanı bağlanan dosya adını basalım. İşaret ettiği dosya sabit bağlantılara sahip olsa bile, yalnızca bir isim basar, bu nedenle sembolik bağın kontrol edilmesi, 2. dosya için inode numaralarının karşılaştırılmasını ve sembolik linklerin bağlandığından emin olmak için dosyaya gerek duyar.

Stat çıkışını bir metin dosyasına yeniden yönlendirebilir ve ardından dosyayı programınızda ayrıştırabilirsiniz.

+1

İndirgemem yok, ancak veriyi metne dönüştürmek ve ardından metni ayrıştırmak için bir komutu çalıştırmak için nadiren bir nokta var. UNIX sistemlerinde, man sayfasının SEE ALSO bölümü, genellikle, komut satırı yardımcı programlarının işlerini gerçekleştirmek için hangi işlevleri yerine getirdiğini size söyleyecektir. Bu durumda 'adam 1 stat' bana 'fstat (2)' ile bir adam sayfasını paylaşan lstat (2) 've' stat (2) 'hakkında bilgi verir, böylece en uygun cevaba kolayca ulaşırsınız. – dmckee

+0

Genel olarak, sisteme çağrı yapan bir şey() Bad Thing (tm). Sadece bir olasılık önerdi, ancak bunun suboptimal olduğunu biliyorum. – mingos

İlgili konular