Dosya tanımlayıcı bağlantılarının taşınabilirliği


20

Ben hep merak ama, öğrenmek için zaman aldı Artık çok yapacağız böylece hiç - ne kadar taşınabilir kullanım olup burada gösterilen ya /proc/$$/fd/$Nya /dev/fd/$N? POSIX garantilerini anlıyorum /dev/null, /dev/tty, and /dev/console (ancak bu cevaptaki yorumları okuduktan sonra geçen gün öğrendim ) ama bu diğerleri ne olacak?

Bildiğim kadarıyla they oldukça yaygın söylemek, ama ne sistemler içinde edebileceğin gibi olabilir değil onları bulmak için beklemek? Neden olmasın? Birini bulma olasılığı diğerinden daha mı fazla? Her zaman benzer özellikler sergileyecekler mi?

Bu cihazları her yönden oldukça yaygın olarak kullanma eğilimindeyim ve sadece denemek için kısa bir şansım olup olmadığını bilmek istiyorum.

Ayrıca yukarıdaki soruları ben yalnızca ne olduğu anlaşılmalıdır düşünüyorum ben açıkçası ilk etapta sormak zorunda çünkü, ben bu konuda iyi bilmiyor olabilir, ben bilmek istiyorum, ama onlar için sıkı şartlara düşünülmemelidir Bir cevap. Eğer yapabilirsen lütfen bana ipucu ver.

Yanıtlar:


27

Sembolik bağların evrensel benzeri Linux üzerinde, ancak (bunları emüle Cygwin günleri hariç) başka bir yerde yoktur. AIX ve Solaris'te de var, ancak sembolik değiller. Portably, açık dosyalar hakkında bilgi almak için yükleyin ./proc/PID/fd/NUM/proc/PID/fd/NUMlsof

İle birleşir /proc/PID/fd

Linux

Linux altında , ID PID işleminin NUM dosya tanımlayıcısında açık olduğu dosyaya biraz sihirli sembolik bir bağlantıdır . Bu bağlantı sihirlidir, örneğin, dosya kaldırılsa bile dosyaya erişmek için kullanılabilir. Bağlantı dosyayı yeniden adlarıyla da izler. işaret eden bir sihirli sembolik link nerede PID linki erişen süreçtir./proc/PID/fd/NUM/proc/self/proc/PID

Bu özellik neredeyse tüm Linux sistemlerinde bulunur. Proc dosya sistemi için sürücü tarafından sağlanır , ancak teknik olarak isteğe bağlıdır, ancak gömülü sistemlerde bile neredeyse hiç dışarıda bırakılmadığı birçok şey ( psişi yapmak - okur ) dahil olmak üzere kullanılır./proc/PID

Cygwin

Cygwin, Linux'ları (Cygwin süreçleri için) ve ./proc/PID/fd/NUM/proc/self

Solaris (2.6 sürümünden beri), AIX

Her bir dosya tanımlayıcı için girişler vardır , ancak bunlar açılan dosya ile aynı türdedir, bu nedenle dosyanın yolu hakkında bilgi vermezler. Bununla birlikte , dosyayı açık olan sürece raporlamakla aynı bilgileri rapor ederler, bu nedenle dosyanın hangi dosya sisteminde bulunduğunu ve inode numarasını belirlemek mümkündür. Dizinler sembolik bağlantılar olarak görünür, ancak bunlar sadece takip edilebilecek ve boş bir dize döndüren sihirli sembollerdir ./proc/PID/fdstatfstatreadlink

AIX altında procfileskomut, bir işlemin açık dosyaları hakkında bazı bilgiler görüntüler. Solaris altında, pfileskomut bir işlemin açık dosyaları hakkında bazı bilgiler görüntüler. Bu, dosyanın yolunu içermez (Solaris'te, Solaris 10'dan beri yapar, aşağıya bakın).

Solaris ( sürüm 10'dan beri )

Buna ek olarak , modern Solaris sürümlerinde Linux'un sembollerine benzer sembolik bağlantılar vardır . Bir süreç hakkında komut gösterileri bilgi yolları da dahil olmak üzere açık dosyaları var./proc/PID/fd/NUM/proc/PID/path/NUM/proc/PID/fd/NUMpfiles

plan9

/proc/PID/fdişlem tarafından açılan her dosya tanımlayıcısı için bir kayıt (satır) içeren bir metin dosyasıdır. Dosya adı orada izlenmez.

QNX

/proc/PID/ bir dizin, ancak dosya tanımlayıcıları hakkında herhangi bir bilgi içermiyor.

/procDosya tanımlayıcılarına doğrudan erişimi olan ancak doğrudan erişimi olmayan birleştirmeler

(Not: bazen altından erişilebilen bellek görüntüsüne bakarak bir işlemin açık dosyaları hakkında bilgi almak mümkündür /proc. Bunu “doğrudan erişim” olarak saymıyorum.)

Unices bir dosya/proc/PID

Proc dosya sisteminin kendisi UNIX 8. baskıda başladı , ancak farklı bir yapıya sahipti ve Plan 9'dan geçerek bazı birleşimlere döndü. Bence tüm işletim sistemleri /procher PID için bir giriş var, ama birçok sistemde, normal bir dosya, bir dizin değil. Aşağıdaki sistemler aşağıdakilerle birlikte okunmalıdır :/proc/PIDioctl

  • 2.5'e kadar Solaris
  • OSF / 1 artık Tru64 olarak biliniyor
  • IRIX (?)
  • SCO (?)

MINIX 3

MINIX 3, dizinler dahil olmak üzere birçok Linux benzeri bileşen sağlayan bir procfs sunucusuna sahiptir . Ancak bu yoktur ./proc/PID//proc/PID/fd

FreeBSD

FreeBSD'nin dizinleri vardır, ancak açık dosya tanımlayıcıları hakkında bilgi sağlamazlar. (Bununla birlikte , Linux'lara benzer , sembolik bir bağlantı aracılığıyla yürütülebilir dosyaya erişim sağlar.)/proc/PID//proc/PID/file/proc/PID/exe

FreeBSD'nin procfs'si kullanımdan kaldırıldı .

Olmayan birlikler /proc

  • HP-UX
  • OpenBSD
  • NetBSD
  • Mac OS X

Diğer kanallardan dosya tanımlayıcı bilgileri

Isıtıcı

fuserAçık bir Belirtilen dosya açın veya bir dosya var süreçler belirtilen komut listeleri bağlama noktası. Bu komut standarttır (tüm XSI uyumlu sistemlerde kullanılabilir, örn. X / Açık Sistem Arabirim Uzantısına sahip POSIX).

Bu yardımcı program ile bir işlemden dosya adlarına gidemezsiniz.

lsof

Lsof “açık dosyaları listele” anlamına gelir. Çoğu unix varyantı için kullanılabilen (ancak genellikle varsayılan kurulumun bir parçası olmayan) bir üçüncü taraf aracıdır . Yukarıdaki analizler sizi şüphelendirmiş olabileceğinden, açık dosyalar hakkında bilgi almak sisteme çok bağlıdır. Lsof sürdürücüsü, hepsini tek bir arayüz altında birleştirme işini yapmıştır.

Ne tür zorluklarla karşılaşmanız gerektiğini görmek için SSS bölümünü okuyabilirsiniz . Çoğu birimlerde, açık dosyaların adları hakkında bilgi edinmek için çekirdek veri yapılarının ayrıştırılması gerekir. SSS 3.3'den alıntılar “Neden tam yol adlarını bildirmiyor?”:

Lsof, aşağıdaki lehçelerin çekirdek adı önbelleklerinden yol adı bileşenleri alamaz:

  • AIX

Yalnızca Linux çekirdeği, açık dosyalar hakkında koruduğu yapılarda tam yol adlarını kaydeder; bunun yerine, çoğu çekirdek yol adlarını aygıta ve düğüm numarası çiftlerine dönüştürür ve dosyalar açıldıktan sonra bunları sonraki dosya başvuruları için kullanır.

Bilgileri lsofçıkışından ayrıştırmanız gerekiyorsa , -Fmodu (satır başına bir alan), tercihen -F0modu (boş sınırlandırılmış alanlar) kullandığınızdan emin olun . Belirli bir işlemin belirli bir dosya tanıtıcısı hakkında bilgi almak için kullanmak -aile seçeneği ve örneğin .-p PID-d NUMlsof -a -p 123 -d 0 -F0n

/dev/fd/NUM geçerli sürecin dosya tanımlayıcıları için

Birçok unix varyantı, bir işlemin açık dosyalarına bir dosya adı ile erişmesini sağlar: açılış , çağrı ile eşdeğerdir . Bu adlar, bir program bir dosya adı istediğinde, ancak zaten açık olan bir dosyayı (örn. Bir boru veya soket) geçirmek istediğinizde kullanışlıdır; örneğin proses ikamesi uygulayan mermiler bunları mümkün olan yerlerde kullanır (mevcut olmayan geçici bir adlandırılmış boru kullanarak )./dev/fd/NUMdup(NUM)/dev/fd

Var /dev/fdolduğunda, genellikle (her zaman?) Eşanlamlıları da vardır (bazen sembolik bağlantılar, bazen sabit bağlantılar, bazen eşdeğer özelliklere sahip sihirli dosyalar) /dev/stdin= /dev/fd/0, /dev/stdout= /dev/fd/1, /dev/stderr= /dev/fd/2.

  • Linux altında, /dev/fdsimgesel bir bağlantıdır /proc/self/fd.
  • Çoğu unice altında ( IRIX , OpenBSD , NetBSD , SCO, Solaris ,…), girişler /dev/fdkarakter aygıtlarıdır. Genellikle dosya tanımlayıcısının açık olup olmadığı görünür ve belirli bir sayının üzerindeki dosya tanımlayıcıları için girişler kullanılamayabilir.
  • FreeBSD ve OSX altında, fdescfs dosya sistemi /dev/fdçağıran sürecin açık tanımlayıcılarını takip eden dinamik bir dizin sağlar . /dev/fdMevcut bir statik mevcut /dev/fddeğil.
  • OSF / 1 (Tru64) altında fdfs/dev/fd aracılığıyla sağlanır .
  • Hiçbir yoktur /dev/fdAIX veya HP-UX üzerinde.

Solaris hakkındaki açıklamalarınız biraz modası geçmiş. Solaris 10 yaşından küçük sürümlerde, pfileskomut dosya tanımlayıcıları yolunu gösterir. Bu bilgileri, /proc/<pid>/pathbahsedebileceğiniz dizinden de alır. Bkz. Docs.oracle.com/cd/E19253-01/817-0547/esxiq/index.html
jlliagre

9

Yol /procuygulanır ve sağladığı özellikler hiçbir şekilde standartlaştırılmaz, örneğin buraya bakın . Wikipedia'ya göre FreeBSD "aşamalı olarak kaldırılıyor" /proc, ayrıntılar için buraya bakın .

İtibariyle /dev, /dev/fd/POSIX oluşumu veya Şartname (SUSv3) Sistem V ve BSD destekleyecek ederken Tek Kullanıcı değildir.

Zeyilname:

Linux: /dev/fd/*bağlanıyor /proc/self/fd.

FreeBSD: /dev/fd/*fdescfs aracılığıyla sağlanır.

NetBSD: FreeBSD ile aynı.

OpenBSD: FreeBSD ile aynı.

Solaris: vardır /dev/fd/*.

IRIX: vardır /dev/fd/*.

Tru64 Unix: nixdoc.net'e/dev/fd/* göre, HP'deki orijinal Tru64 belgeleri anlaşılmazdır (çocuk, ne dağınıklık! Hiçbir şey bulamazsınız!).

AIX: halka açık belgelerden herhangi bir belirti bulunamadı.

HP-UX: AIX ile aynı.


Öyleyse /dev/fd/1BSD'de akımıma bağlanan bir tane bulacağım 1>? Linux'ta yaygın olarak yaptığım bir şey echo 'command' | . /dev/fd/0, bu tür bir şeyin tahtada çalışması muhtemel mi?
mikeserv

Şu anda bir BSD sistemine erişimim yok, ama bunu böyle anlıyorum, evet.
sayaç

1
Sadece biraz daha genişletmek için zaman bulursanız, bu cevabı kabul edeceğim, bence, herhangi bir sürpriz prof fd mesajını engelliyoruz. Her halükarda bağlantı verilen ilk makale aydınlatıcı bir okumaydı - çok teşekkür ederim.
mikeserv

Evet. Sanırım prof fd sonuçta geldi, ha? Bir dahaki sefere daha iyi şanslar mı?
mikeserv

1
Tamam o zaman. Linux: / dev / fd / *, / proc / self / fd için simgelerdir. FreeBSD: / dev / fd / * fdescfs aracılığıyla sağlanır. NetBSD: FreeBSD ile aynı. OpenBSD: FreeBSD ile aynı. Solaris: / dev / fd / * özelliğine sahiptir. IRIX: / dev / fd / * içerir. Tru64 Unix: / dev / fd / * özelliğine sahiptir ( nixdoc.net'e göre, HP'deki orijinal Tru64 belgeleri anlaşılmazdır). AIX: halka açık belgelerden herhangi bir belirti bulunamadı. HP-UX: AIX ile aynı.
sayaç
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.