Başka bir işlemin içeriğini yeniden yazarken bir dosyayı okuduğumu varsayalım. Çıktı öngörülebilir mi? Ne olacaktı
Başka bir işlemin içeriğini yeniden yazarken bir dosyayı okuduğumu varsayalım. Çıktı öngörülebilir mi? Ne olacaktı
Yanıtlar:
Bu yazarın ne yaptığına bağlı.
Eğer yazar mevcut dosyanın üzerine yazarsa, yazar okuyucuyu soluk bıraktığında, okuyucu yeni içeriği görecektir. Yazar ve okuyucu değişken hızlarda ilerlerse, okuyucu alternatif olarak eski ve yeni içeriği görebilir.
Yazar dosyayı yazmaya başlamadan önce dosyayı kısaltırsa, okuyucu bu noktada dosyanın sonuna karşı çalışacaktır.
Yazar yeni bir dosya oluşturursa, yeni dosyayı eski ada taşırsa, okuyucu eski dosyadan okumaya devam eder. Açık bir dosya taşınır veya kaldırılırsa, dosyayı açan işlemler aynı dosyadan okunmaya devam eder. Dosya kaldırılırsa, son işlem kapanana kadar diskte kalır (ancak tekrar açmanın bir yolu yoktur).
Unix sistemleri zorunlu kilitlere sahip değildir . Bir uygulama, yazıcı bileşeninin ve okuyucu bileşeninin birbirinin ayak parmaklarına basmamasını sağlamak isterse, uygun kilitlemeyi kullanmak geliştiriciye kalmıştır. Çekirdeğin açtığı bir dosyanın kullanıcı uygulamaları tarafından yazmaya karşı korunabileceği birkaç durum vardır, örneğin, döngüsel olarak monte edilmiş bir dosya sistemi görüntüsü veya bazı unix türevlerinde yürütülen bir çalıştırılabilir dosya.
ftp
/ sftp
senaryolarda da geçerli mi? Bir işlemin iletilen ftp
dosyayı okumaya başladığını söylerken, aynı dosyanın başka bir sürümü yeni bir iletim nedeniyle dosyanın üzerine yazıyor.
Klasik bir yarış koşulu, bu nedenle sonuç tanım olarak tahmin edilemez.
Diğerleri arasında, bağlıdır
fopen(3)
veya open(2)
modları yazmak,Bir dosyayı, yeniden yazıldığı sırada okuyabilmeniz gerekiyorsa, yazarı dosyanın geçici bir kopyasını çıkartabilir, değiştirebilir ve sonra orijinal dosyaya kopyalayabilirsiniz. Bu şekilde rsync
örneğin, bunu yapar. Bunu uygulamanın çeşitli yolları vardır, ancak ücretsiz öğle yemeği yoktur. Her yöntemin kendi eksiklikleri ve yan etkileri vardır.
Önceki cevaplayıcıların bundan daha kapsamlı açıklamaları var, ama işte kesinlikle de işe yarayan bir numara, tam olarak istediği şeyi yaparak:
$ tail -f <filename>
Dosyanın sonunu yazıldığı gibi gösterir. Örneğin STDERR'yi bir dosyaya bağlamak, ancak yine de başka bir terminal penceresinde görmek isterseniz kullanışlı.