Farklı süreçlerde aynı fd aynı dosyaya nasıl işaret edebilir?


25

Diyelim ki süreç 1 ve işlem 2 benim . Her ikisinde de 4 tamsayısına karşılık gelen bir dosya tanımlayıcısı var.

Bununla birlikte, her bir işlemde, dosya tanımlayıcısı 4, çekirdeğin Açık Dosya Tablosunda tamamen farklı bir dosyaya işaret eder:

görüntü tanımını buraya girin

Bu nasıl mümkün olabilir? Bir dosya tanımlayıcısının, Açık Dosya Tablosunda bir kaydın indeksi olması gerekmiyor mu?


1
İyi soru! Benim tahminim, dosya tanımlayıcılarının çevrilmiş olması, böylece 4her iki işlemde de fd'nin kendi açık fd'lerine göre olması. Fd en 0-2(stdin, stdout sdterr) her zaman yeni bir süreç için açılır ve rakamlar yalnızca söz konusu işlem için ayrılmış değildir.


@ jw013 Bunun tanıdık geldiğini düşündüm. \ @Pithikos Bu nasıl bir kopya değil?
Michael Mrozek

1
Bu zayıf bir diyagramdır - dosya tanımlayıcı 4'ün "4" içeren bir girdi değil, soldaki dosya tanımlayıcı tablosunun dördüncü girişi ( yani beşinci, sıfırdan sayılır) anlamına geldiğini göstermelidir . Gerçek "4", sayı içeren kullanıcı alanı değişkeninizde yaşar. Diğer sorudaki diyagram çok daha iyi.
Random832

2
@ Random832 Peki hangi diyagramın doğru olduğunu bilseydim, muhtemelen bu soruyu asla yapmazdım.
Pithikos

Yanıtlar:


35

Dosya tanıtıcı, yani 4sizin örnekte, süreç özgü içine endeksidir dosya tanımlayıcı tablosu , değil açık dosya tablosu. Dosya tanıtıcı giriş kendisi içeren bir çekirdeğin küresel açık dosya tablosunda bir girişe endeksi, hem de dosya tanıtıcı seçeneklerini.


2
Kayıt için, çoğu sistemde, yürütmeye yakın bayrağı olarak yalnızca bir "dosya tanıtıcı bayrağı" vardır. Diğer tüm "per-fd" durumları (ofset ve erişim modu dahil) açık dosya tablosu girişinin bir parçasıdır.
Random832

24

Her işlemin kendi dosya tanımlayıcı tablosu vardır. 1234 işlemindeki dosya tanımlayıcı 4, işlem 1234 tablosunun içindedir. 5678 işlemindeki dosya tanıtıcısı 4, işlem 5678'in çizelgesinin içindedir. Aşina olmanız gereken bir durum, her işlem için standart girdi, standart çıktı ve standart hata olan ve bunların nereye yönlendirildiğini gösteren 0, 1 ve 2 dosya tanımlayıcılarıdır.

Bir işlem aynı dosyayı bir defadan fazla açabilir. Bu, örneğin bir işlemin standart çıktısı ve standart hatası aynı uçbirime veya aynı dosyaya yönlendirildiğinde, tesadüfen gerçekleşebilir. Temel dosya tablosu girdileri (örneğin Linux'larstruct file ) dosya hakkındaki bilgilerden daha fazlasını taşır; ayrıca açılış modları (örneğin, okuma veya yazma) ve diğer durumları (bayraklar, örneğin uygulamaya yakın) içerirler. Örneğin, bir işlem yalnızca dosya tanımlayıcısı 0'da okumak için açılan bir terminali ve yalnızca dosya tanımlayıcısı 2'ye yazmak için açılan aynı terminali içerebilir. Bir işlem lseekaynı dosyada iki farklı pozisyona geçmek isteyebilir ve bu dosyaya dupiki tutamaç elde etmek için bunu kullanır .


2
Bu tamamen doğru değil. Man sayfasına / teknik özelliklerine göre, dupteneke üzerinde tam olarak ne yazıyorsa: her iki sonuçta ortaya çıkan tanımlayıcılar aynı dosya tablosu girişine işaret eder ve böylece aynı ofseti paylaşır. 2 farklı dosya tablosu girişi elde etmek için open, dosyaya iki kez ihtiyaç duyduğunuzdan eminim .
jw013

@ Gilles "İşlem 1234'teki dosya tanımlayıcısı 4, işlem 1234'ün çizelgesinin içindedir". Hangi masayı kastediyorsun? Bildiğim kadarıyla süreçteki tek tablo, her bir kaydın çekirdeğin tek Açık Dosya Tablosuna işaret ettiği Dosya Tanımlayıcı Tablosu'dur .
Pithikos



7

Fazladan bir dolaylı seviyeye çıkma sorununuzu çözmez mi? ("Bilgisayar programcılığındaki tüm problemler, fazladan bir dolaylı seviye ile çözülebilir" - bazı akıllıca). Diğer bir deyişle, her bir işlemdeki küçük tam sayı, "Dosya Tablosunu Aç" içine, işlem başına bir çekirdek-alanı dizin dizisine bir endeks olarak sonlanır.


2
Kaynak bilge ihtiyar adam olasılıkla David Wheeler. Görünen o ki, " Ama bu genellikle başka bir sorun yaratacaktır. " :)
jw013
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.