/ proc / PID / fd / X bağlantı numarası


36

Linux'ta, içinde /proc/PID/fd/X, borular veya yuvalar olan dosya tanımlayıcıları için bağlantılar aşağıdaki gibidir:

l-wx------ 1 user user 64 Mar 24 00:05 1 -> pipe:[6839]
l-wx------ 1 user user 64 Mar 24 00:05 2 -> pipe:[6839]
lrwx------ 1 user user 64 Mar 24 00:05 3 -> socket:[3142925]
lrwx------ 1 user user 64 Mar 24 00:05 4 -> socket:[3142926]
lr-x------ 1 user user 64 Mar 24 00:05 5 -> pipe:[3142927]
l-wx------ 1 user user 64 Mar 24 00:05 6 -> pipe:[3142927]
lrwx------ 1 user user 64 Mar 24 00:05 7 -> socket:[3142930]
lrwx------ 1 user user 64 Mar 24 00:05 8 -> socket:[3142932]
lr-x------ 1 user user 64 Mar 24 00:05 9 -> pipe:[9837788]

İlk satırdaki gibi: 6839. Bu sayı neyi temsil ediyor?

Yanıtlar:


36

Söz konusu boru veya soketin inode numarası.

Bir boru, bir yazma ucu ve bir okuma ucu ile tek yönlü bir kanaldır. Örnekte, FD 5 ve FD 6 birbirleriyle konuşuyor gibi görünüyor, çünkü inode sayıları aynı. (Belki olmasa da. Aşağıya bakınız.)

Bir programın kendisiyle bir boru üzerinde konuştuğunu görmekten daha yaygın olanı, birbirleriyle konuşan bir çift ayrı programdır, çünkü genellikle bir kabuk ile aralarında bir boru kurdunuz:

shell-1$ ls -lR / | less

Sonra başka bir terminal penceresinde:

shell-2$ ...find the ls and less PIDs with ps; say 4242 and 4243 for this example...
shell-2$ ls -l /proc/4242/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 1 -> pipe:[222536390]
shell-2$ ls -l /proc/4243/fd | grep pipe
l-wx------ 1 user user 64 Mar 24 12:18 0 -> pipe:[222536390]

Bu, PID 4242'nin standart çıktısının (konvansiyonel olarak FD 1) 222536390 numaralı inode'lu bir boruya bağlandığını ve PID 4243'ün standart girişinin (FD 0) aynı boruya bağlandığını söylüyor.

Bunların hepsi, lsçıktısının lessgirişine gönderildiğini söylemenin uzun bir yoludur .

Senin örneğe geri alma, FD 1 ve FD 2 neredeyse kesin olan değil birbirleriyle konuşurlar. Büyük olasılıkla bu, birlikte stdout (FD 1) ve stderr (FD 2) bağlamanın sonucudur, bu yüzden ikisi de aynı hedefe gider. Böyle bir Bourne kabuğu ile yapabilirsiniz:

$ some-program 2>&1 | some-other-program

Böylece, etrafa /proc/$PID_OF_SOME_OTHER_PROGRAM/fdgirerseniz, some-programörnek için FD 1 ve 2'ye eklenmiş aynı inode numarasına sahip bir boruya bağlı üçüncü bir FD bulacaksınız . Örnekte 5 ve 6 numaralı FD'lerde olan şey de olabilir, ancak bu iki FD'nin nasıl birbirine bağlandığı konusunda hiçbir teorim yok. Bunu anlamak için programın dahili olarak ne yaptığını bilmek zorundasınız.


1
Örnek, bence, çok pidgin- çok fazla boru ve soket vardı ve başka şeyler de vardı, bu yüzden güzel bir örnek oldu. Son bir soru: inode sadece belirli bir dosya sistemi bağlamında özeldir, doğru mu? Olduğu gibi, /dosya sistemimde 3, başka bir (farklı) /bootdosya sistemimde de 3 olabilirdi .
Thanatos

4
Evet. Durumunda /procdosya sistemi, inode numaraları sadece sinek (bkz oluşur get_next_ino()içinde fs/inode.csistem taze önyükleme yaparken 0'dan başlayarak çekirdeğindeki). Onları oluşturan mekanizma inode numaraları aralarında Linux'un impersistent dosya sistemleri (proc, configfs, ramfs, autofs ...) çeşitli tarafından paylaşılır olan POSIX semantik bunu talep olmasa bile eşsiz. Ancak bu oldukça özel bir durum. Bahsettiğiniz kural genellikle ext3 gibi normal kalıcı dosya sistemleri ile bağlantılı olarak referans alınır.
Warren Young

33

Soketler için /proc/net/tcp, /proc/net/udpveya içindeki inode hakkında daha fazla bilgi bulabilirsiniz /proc/net/unix. Örneğin:

ls -l /proc/<pid>/fd
lrwx------ 1 root root 64 May 26 22:03 3 -> socket:[53710569]

Inode'un 53710569 olduğunu görüyoruz.

head -n1 < tcp ; grep -a 53710569 tcp
sl  local_address rem_address   st tx_queue rx_queue tr tm->when retrnsmt   uid  timeout inode                   
155: 0100007F:001B 00000000:0000 0A 00000000:00000000 00:00000000 00000000  0        0 53710569 1 ffff88011f52c200 300 0 0 2 -1

Bu durumda, bu yerel port 27'yi (0x1B) dinleyen bir dinleme soketidir (uzak adres yok). IP adresleri "ağ gösterimi" altında onaltılık 4 bayttır, bu inet_ntoaişlevi standart abcd notasyonuna dönüştürmek için kullanabilirsiniz (bu durumda 127.0.0.1).

Bu dosyaların 0 bayt göründüğünü, ancak okursanız içeriğe sahip olduğunu unutmayın. Ayrıca -agrep için gerekli olduğuna dikkat edin (örneğin ile birlikte unix) ikili görünebilir.


Ayrıca /proc/net/tcp6ve /proc/net/udp6IPv6 için de var .
Craig McQueen
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.