File Descriptor
Dosya Tanıtıcısı
- Türkçe karşılığı
- dosya tanımlayıcısı
- Okunuşu
- fayl diskriptır
Günlük kullanımda çoğunlukla İngilizcesi tercih edilir.
Kısaca
File descriptor, Unix benzeri bir işletim sisteminin process'e açık bir dosya, socket, pipe ya da başka bir girdi/çıktı kaynağı için verdiği küçük tamsayıdır.
File descriptor (dosya tanıtıcısı) nedir?
Bir process Unix benzeri bir sistemde bir dosya açtığında kernel, file descriptor denen küçük, negatif olmayan bir tamsayı döndürür. Process bu numarayı sonraki read, write ve close gibi system call'lara iletir. Aynı mekanizma sıradan dosyalardan çok daha fazlasını kapsar: pipe'lar, ağ socket'leri, terminaller ve aygıtların hepsine, her şeyin bir dosya olduğu Unix fikrine uygun olarak, file descriptor'lar üzerinden erişilir.
Her process'in kernel içinde bir file descriptor tablosu vardır ve tanıtıcı bu tabloya bir indekstir. Geleneksel olarak 0 standart girdi, 1 standart çıktı ve 2 standart hatadır; her yeni açılış en düşük boş numarayı alır. Alt process'ler üst process'lerinin tanıtıcılarını miras alır; shell yönlendirmesi ve pipe'lar bu şekilde çalışır: 2>&1, 2 numaralı tanıtıcıyı 1 numaralı tanıtıcının işaret ettiği yere işaret ettir demektir. Her process'in ayrıca açık tanıtıcılar için bir sınırı vardır, çoğu zaman varsayılan olarak 1.024; bu yüzden yoğun sunucular bunu yükseltir ve dosyaları kapatmayı unutan kod eninde sonunda Too many open files hatasıyla başarısız olur.
File descriptor bir vestiyer bileti gibidir. Paltonuzu verirsiniz, kernel dosyayı açar ve numaralı bir bilet alırsınız; paltoyu kullanmak istediğinizde bileti gösterirsiniz. Numaranın kendi process'inizin dışında bir anlamı yoktur; tıpkı biletinizin başka bir mekânda işe yaramaması gibi.
File descriptor çoğu zaman dosya adıyla karıştırılır. Yol (path) diskteki bir dosyayı adlandırır; tanıtıcı ise onun bir process içindeki açık bir örneğine başvurur. Bu yüzden aynı dosyayı açan iki process ayrı, hatta aynı numaraya sahip olabilen tanıtıcılar alır. Windows, handle denen benzer bir kavram kullanır. C'de standart kütüphaneden gelen bir FILE* akışı, bir file descriptor'ın etrafındaki tamponlu bir sarmalayıcıdır ve socket, bir tanıtıcının işaret edebileceği kaynak türlerinden biridir.
Önemli noktalar
- File descriptor, açık bir I/O kaynağına başvuran, process başına bir tamsayıdır.
- 0, 1 ve 2 numaralı tanıtıcılar standart girdi, standart çıktı ve standart hatadır.
- Dosyalara, pipe'lara, socket'lere ve aygıtlara tanıtıcılar üzerinden erişilir.
- Shell yönlendirmesi ve pipe'lar tanıtıcıları yeniden düzenleyerek çalışır.
- Tanıtıcıları kapatmayı unutmak Too many open files hatalarına yol açar.
Örnek
# 0 = stdin, 1 = stdout, 2 = stderr
# Send normal output to one file and errors to another
ls /etc /missing > out.txt 2> errors.txt
# Point stderr (2) at stdout (1), then pipe both into grep
ls /etc /missing 2>&1 | grep missing
# List the open file descriptors of the current shell (Linux)
ls -l /proc/$$/fd
# Show the limit on open descriptors per process
ulimit -nSık sorulan sorular
0, 1 ve 2 numaralı file descriptor'lar nedir?
Her process'in başladığı üç standart akıştır: 0 standart girdi (stdin), 1 standart çıktı (stdout) ve 2 standart hata (stderr).
Too many open files ne anlama gelir?
Process'in açık file descriptor sınırına ulaştığı anlamına gelir. Ya program dosyaları veya socket'leri kapatmayarak tanıtıcı sızdırıyordur ya da gerçekten daha fazlasına ihtiyacı vardır ve sınır ulimit ile veya servis yapılandırmasıyla yükseltilmelidir.
Bir shell komutunda 2>&1 ne anlama gelir?
2 numaralı file descriptor'ı, yani standart hatayı, 1 numaralı tanıtıcının, yani standart çıktının o anda işaret ettiği yere yönlendirir. Bu, hata mesajlarını normal çıktıyla birlikte yakalamanızı ya da pipe'lamanızı sağlar.
İlgili sayfalar
- Dosya Sistemiİşletim Sistemleri, s. 10Dosya sistemi, işletim sisteminin bir depolama aygıtındaki veriyi dosya ve klasörlere düzenleyen ve her parçanın nerede saklandığını izleyen bölümüdür.
- System Callİşletim Sistemleri, s. 32System call, bir programın işletim sistemi kernel'ından bir dosyayı okumak ya da process başlatmak gibi ayrıcalıklı bir işlem yapmasını istediği çağrıdır.
- Processİşletim Sistemleri, s. 23Process, bir programın çalışan örneğidir; işletim sistemi tarafından yönetilen kendi bellek alanına, kaynaklarına ve en az bir yürütme iş parçacığına sahiptir.
- SocketAğlar, s. 26Socket, bir programın ağ üzerinden veri gönderip almak için açtığı; IP adresi, port numarası ve protokolle tanımlanan yazılım tabanlı bir uç noktadır.
- Shellİşletim Sistemleri, s. 28Shell, kullanıcının yazdığı ya da bir betikte yazılı komutları okuyup işletim sisteminden çalıştırmasını isteyen, genellikle metin arayüzlü bir programdır.
- Memory Leakİşletim Sistemleri, s. 20Memory leak, bir programın artık ihtiyaç duymadığı belleği tutmayı sürdürdüğü hatadır; bellek kullanımı zamanla artar, sistem yavaşlayabilir ya da çökebilir.
Bu sayfada bir hata ya da eksik mi gördünüz?Düzeltme önerin