Dosya tanımlayıcı ve çatal


15

Bir çocuk çatallandığında ebeveynin dosya tanımlayıcılarını devralır, çocuk dosya tanımlayıcıyı kapatırsa ne olur? Çocuk yazmaya başlarsa, ebeveynin sonunda dosyaya ne olur? Bu tutarsızlıkları, çekirdeği veya kullanıcıyı kim yönetir?

bir işlem closebelirli bir açık dosyayı dosya tanımlayıcı aracılığıyla kapatmak için işlevi çağırdığında . İşlemin dosya tablosunda, başvuru sayısı bir azaltılır. Ancak ebeveyn ve alt öğenin her ikisi de aynı dosyayı tuttuğundan, başvuru sayısı 2'dir ve kapatıldıktan sonra 1'e düşer. Sıfır olmadığından işlem, dosyayı sorunsuz bir şekilde kullanmaya devam eder.

Terrence Chan UNIX sistem programlaması, (Dosyalar için Unix çekirdek desteği).


Tamam, bu son yorumunu aldırma;) man sayfalarında open()ve fork()orada arasında bir ayrımdır dosya descript-ya ve dosya descipt-iyon - Eski sonra ifade eder ve bir çatal içinde tanımlayıcılar kopya olmasına rağmen, aynı açıklamaya atıfta bulunurlar. Ancak, test edildiğinde bu, çocuğun kolunun kapatılmasının ebeveynlerin kolunu kapatması anlamına gelmediği açıktır. Her iki tanıtıcı yazarken veri serpiştirmesinde küçük bir fark yaratabileceğini düşünüyorum - ama yine de belirsiz, bu yüzden tam olarak nasıl olduğu çok önemli değil.
goldilocks 17:13

Yanıtlar:


29

Bir çocuk çatallandığında ebeveynin dosya tanımlayıcılarını devralır, çocuk dosya tanımlayıcıyı kapatırsa ne olur?

Dosya tanımlayıcının bir kopyasını devralır . Bu nedenle, tanımlayıcıyı çocukta kapatmak, çocuk için kapatır, ancak ebeveyn için değil, tersi de geçerlidir.

Çocuk yazmaya başlarsa, ebeveynin sonunda dosyaya ne olur? Bu tutarsızlıkları, çekirdeği veya kullanıcıyı kim yönetir?

Aynı dosyaya yazılan iki işlemle tam olarak (tam anlamıyla olduğu gibi) aynıdır. Çekirdek, işlemleri bağımsız olarak zamanlar, böylece dosyada araya eklenmiş veriler alırsınız.

Ancak, POSIX (buna * nix sistemlerinin büyük ölçüde veya tamamen uyumlu olduğu), C API'sinden (sistem çağrılarıyla eşlenen) read()ve write()işlevlerin, normal dosyalarda çalıştıklarında birbirlerine göre atomik olduklarını [...] veya msgstr "% s: sembolik bağlantılar". GNU C manuel olarak bunu borular açısından da geçici olarak vaat eder ( PIPE_BUFşartın bir parçası olan varsayılan değerin 64 kilo olduğuna dikkat edin). Bu , sözleşmenin kullanımı echoveya gibi diğer dillerde / araçlarda yapılan çağrıların catsöz konusu sözleşmeye dahil edilmesi gerektiği anlamına gelir, bu nedenle iki bağımsız süreç aynı anda "merhaba" ve "dünya" yı aynı anda yazmaya çalışırsa, diğeri ortaya çıkar sonu "helloworld" veya "worldhello" dur ve asla "

belirli bir açık dosyayı dosya tanımlayıcı aracılığıyla kapatmak için bir işlem çağrısı kapatma işlevi. işlemin dosya tablosu referans sayısını bir azaltır. ancak üst ve alt öğelerin her ikisi de aynı dosyayı tuttuğundan (referans sayısı 2'dir ve kapatıldıktan sonra azalır 1) sıfır olmadığı için işlem dosya sorunsuz bir şekilde kullanılmaya devam eder.

Ebeveyn ve çocuk olmak üzere İKİ süreç vardır. Her ikisinde de ortak olan "referans sayısı" yoktur. Bağımsızlar. WRT bunlardan biri bir dosya tanımlayıcıyı kapattığında ne olur, ilk sorunun cevabına bakın.


1

fork()Yeni bir alt öğe oluşturduğunda, dosya tanımlayıcıları hiç korunmaz - değiştirilir.

Dosya bir kopya olmasına rağmen, farklı bir dosya tanımlayıcıya sahip olacaktır.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.