dosya tanıtıcısı ile dosya adı karşılaştırması


12

Dosya tanımlayıcıları ve dosya adları arasındaki farkların ve ilişkilerin ne olduğunu merak ediyordum. Hepsi dosyalara erişmek için mi kullanılıyor? Evet ise, aynı şekilde?

Örneğin, /dev/fd/0, /dev/stdin, ve /proc/self/fd/0tüm bağlantıları vardır /dev/pts/2. Bu dört dosya tanıtıcısı mı yoksa dosya adı mı?


Yanıtlar:


12

Tüm dört /dev/fd/0, /dev/stdin, /proc/self/fd/0ve /dev/pts/2dosya adları, gibidir /////dev/../dev/fd//0, /bin/sh, /etc/fstab, /fioejfoeijf, vb Tüm ama bu son örnek olasılıkla makinenizde mevcut bir dosyanın adı olması için vardır. Dosya adı, dosya sisteminizde bir dosya belirleyebilen bir dizedir; Linux altında, boş bir bayt içermeyen ve en fazla 4096 bayt uzunluğunda olan herhangi bir dize geçerli bir dosya adıdır. Bu isimlerin çoğu örneğin eşdeğerdir /bin/sheşdeğer olduğu ///bin/sh, /bin/../bin/sh(varsayarak /binvarolan dizini edilir) vb ı verdik Bütün örnekler şu ana kadar mutlak dosya isimleridir; bir ile başlamayan /ve anlamları geçerli dizine bağlı olan göreceli dosya adları da vardır .

Dosya adlarını çevreleyen terminoloji evrensel değildir; bazen “dosya adı” bir dosyanın tam yolu anlamına gelir ve bazen de bir dizin girişinin adı anlamına gelir. POSIX terminolojisi, bir dizin girişinin adı için “ dosya adı ” veya “ yol adı bileşeni ” ve tam yol için “ yol adı ” dır .

Dosya tanımlayıcı, belirli bir işlemde açık bir dosya belirtir . Çekirdek, her işlem için bir dosya tanımlayıcıları tablosu tutar. Dosya tanımlayıcı tablosundaki her girdi, işlem dosya tanımlayıcıdaki okuma, yazma ve diğer işlemleri isterse ne yapılacağını gösterir.

Dosya tanımlayıcıları bir dosyaya karşılık gelebilir ve ilişkili bir ada sahip olabilir, ancak hepsi buna sahip değildir. Bunu yapanlar için, dosya normal bir dosya, bir dizin, bir aygıt dosyası veya adlandırılmış bir kanal (FIFO olarak da adlandırılır) (tarafından oluşturulan tür mkfifo) olabilir; bazı sistemlerde unix soketleri ve kapılar gibi başka olasılıklar da vardır. İlişkilendirilmiş adlandırılmış bir dosyaya sahip olmayan dosya tanımlayıcı örnekleri arasında borular (tarafından oluşturulan tür pipe) ve ağ yuvaları bulunur .

/dev/fd/0, /dev/stdinve /proc/self/fd/0tuhaf bir anlamı olan dosya adlarıdır (tümü eşdeğerdir): hepsi dosya tanımlayıcı 0 aracılığıyla şu anda hangi dosyaya erişildiğini belirtir. Bir işlem bunları açtığında, çekirdek dosya tanımlayıcı tanımlayıcı tablosundaki dizin 0 ile girişi yeni bir dosyaya kopyalar. açıklayıcısı. Bu dosyalardan herhangi birini açmak çağrıya eşdeğerdir dup(0). Adlandırılmış dosyalar, yeni bir dosya açmak yerine, zaten açık olan dosyalarından birini kullanmak için dolaylı olarak bir işlem elde etmenin bir yoludur; çoğunlukla programın bir dosyanın adının açılmasını beklediği bir programın komut satırından geçmek için kullanışlıdır.


@Giles "Dosya tanıtıcı tablosundaki her girdi, işlem dosya tanıtıcısında okuma, yazma ve diğer işlemleri isterse ne yapılacağını belirtir ." ( Benimkini vurgulayın ). Anladığım kadarıyla, sırasıyla stdin, stdout ve stderr için standart 0,1,2 vb. Gibi bir tam sayıdır. Normal dosyalar için daha yüksek değerli sayılar olacaktır. Senin yorumdan alamadım ne bu sayı "süreç dosya tanımlayıcı üzerinde okuma, yazma ve diğer işlemleri talep ederse ne yapması gerektiğini" gösterir. . Bunu biraz genişletebilir misiniz?
Geek

@Geek Dosya tanımlayıcı tablosundaki bir girdi sayı değil. Sayı, bu tablonun dizinidir.
Gilles 'SO- kötü olmayı kes'

@Giles, yanlış anladığımı açıklığa kavuşturduğun için teşekkürler. Şimdi daha iyi anlıyorum. Lütfen cevabınızda "ne yapmalı" kısmına bir örnek verebilir misiniz? Dosya tanımlayıcı tablosundaki her bir girişin, dosya ofseti, dosya durumu vb.
Geek

2

Dosya adı sadece dosya sistemindeki dosyanın adıdır, başka bir şey değildir - sadece bir dizedir.

Dosya tanımlayıcı, okuyabileceğiniz ve / veya yazabileceğiniz bir tür nesnedir. Açılmış ve hazır dosya. Sadece dosya tanımlayıcıları yoktur - stdin, stdout ve stderr de tanımlayıcılardır, dosyalarla kesinlikle aynı işlevleri kullanarak bunlardan yazabilir ve okuyabilirsiniz (örneğin arama yapamazsınız). Dosya olmayan diğer tanımlayıcı örnekleri şunlardır: adlandırılmış yöneltmeler ve ağ soketleri.

Kodda, dosya tanımlayıcı, dosya nesnesini temsil eden çekirdekteki bir şeye işaret eden bir değişkendir.

Örneğin, / dev / fd / 0, / dev / stdin, / proc / self / fd / 0, / dev / pts / 2'ye bağlantılardır. Bu dört dosya tanıtıcısı mı yoksa dosya adı mı?

Bunların tümü, bazı komut dosyaları veya programlar için yararlı olabilecek sözde dosyalardır. Onları açabilir ve open () size bir dosya tanımlayıcı döndürü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.