Dosya tanımlayıcının ömrü nedir?


11

Açıklandığı gibi burada , yönlendirmeler kullanmak open()bir dosyaya yazmak için. Kabukta oluşturulan ve gerektiğinde kullanılan bir iç (?) Dosya tanıtıcısı vardır.

İç tanımlayıcı komut dosyasının tüm süresi boyunca mı yoksa kabuk ömrü boyunca mı oluşturulur? Bir süre sonra, birkaç operasyondan vb. Yok edildi mi?

Özellikle kabuğun kendi yerleşik işlemleri için açtığı dosyalar için dosya tanımlayıcıları kastediyorum. Her işlem için tanımlayıcı oluşturuldu ve dosya açıldı mı? Ne kadar tutulurlar? Misal:

#!/bin/bash
>>x echo something
...do many other things not related to the file x
>>x echo something more

İlk tanımlayıcı örneği ikinci işleme kadar saklanıyor mu?

Bir terminalde kullandığım kabuk ne olacak? Bazen bir seansı günlerce, hatta haftalarca açık tutarım. Kabuk yerleşikleriyle çalıştırdığım tüm dosyaların tanımlayıcılarını hala saklıyor mu?

Yanıtlar:


4

Kısaca: Bir kabuk, komut tamamlandıktan hemen sonra yeniden yönlendirmelerle ilgili dosya tanımlayıcılarını neredeyse kesinlikle kapatacaktır.


Ayrıntılar: POSIX'te yeniden yönlendirmelerle açılan dosyaları kapattığımıza dair açık bir söz yok (görebildiğim kadarıyla). Ancak onları hemen kapatmamak çok yararlı olmaz.

Herhangi komutlar başlanırsa çevre için kurallar ekstra dosya tanımlayıcıları geçmek için izin vermez. Kabuğun, sahip olmaması gereken bir komutu başlatırken kaydedilen ekstra fd'leri kapatmaya dikkat etmesi gerekir.

Her zamanki > filenameçıktı yönlendirmeleri için, dosya tanımlayıcı kaydedilmiş olsa bile, her komutu başlatırken dosyanın kesilmesi gerekir. Ve herhangi konusu dosya yeniden adlandırılmış veya bu arada kaldırılması durumunda kaydedilen dosya tanıtıcı yanlış dosyasına işaret olacaktır.

Örneğin, birincisi için açılan fd açık echotutulur ve ikincisi için olduğu gibi kullanılırsa , bu doğru davranmaz :

echo foo >> x; mv x y; echo bar >> x

Harici programları başlatmak için kullanılan normal fork + exec modeli, komuttan çıkıldığında dosyaların otomatik olarak kapatılmasını da kolaylaştırır. Kabuk fork(), alt öğeyi exec()gerçek komutla değiştirmeye çağırmadan önce, yalnızca alt işlemde gerekli dosyaları açmalı ve açmalıdır. Alt işlemden çıkıldığında, açtığı dosyalar otomatik olarak kapatılır.


Bununlaawk birlikte, çıktı yeniden yönlendirme sözdizimi kabuğa benzer, ancak açıkça kapatılmadığı sürece, açık dosyalar komut dosyası çıkana kadar açık tutulur. Bu yalnızca bir fookez açılır ve baskılar arasında da kesilmez:

awk 'BEGIN { print "a" > "foo"; print "b" > "foo" }'

6

İşiniz bittiğinde kapalıdır. Kabuk, çalıştırdığı her komut için 0,1,2'lik 3 dosya tanımlayıcısı oluşturur. Bunlar sadece sayılardır, sayılar yeniden kullanılır. Kabuk, tanımlayıcıları yeniden kullanmadan önce dosyaları kapatır.

Dosya tanımlayıcıları diğer işlemlere de aktarılır. Ve arka planda bir işlem varsa, yine de dosya tanımlayıcıları olacaktır.

Örnekte 3>&1, bu, tanımlayıcı 3'ün tanımlayıcı 1'in şu anda başvurduğu dosyaya başvurması anlamına gelir.

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.