/ proc / PID / fd / X nomor tautan

36

Di Linux, in /proc/PID/fd/X, tautan untuk deskriptor file yang berupa pipa atau soket memiliki nomor, seperti:

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]

Seperti pada baris pertama: 6839. Berapakah angka yang diwakili?

Thanatos
sumber

Jawaban:

36

Itu nomor inode untuk pipa atau soket yang dimaksud.

Pipa adalah saluran searah, dengan ujung tulis dan ujung baca. Dalam contoh Anda, sepertinya FD 5 dan FD 6 berbicara satu sama lain, karena angka inode sama. (Mungkin tidak. Lihat di bawah.)

Lebih umum daripada melihat program berbicara sendiri melalui pipa adalah sepasang program terpisah yang berbicara satu sama lain, biasanya karena Anda memasang pipa di antara mereka dengan sebuah shell:

shell-1$ ls -lR / | less

Kemudian di jendela terminal lain:

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]

Ini mengatakan bahwa output standar PID 4242 (FD 1, berdasarkan konvensi) terhubung ke pipa dengan nomor inode 222536390, dan input standar PID 4243 (FD 0) terhubung ke pipa yang sama.

Semua itu adalah cara yang panjang untuk mengatakan bahwa lsoutput sedang dikirim ke lessinput.

Kembali ke contoh Anda, FD 1 dan FD 2 hampir pasti tidak berbicara satu sama lain. Kemungkinan besar ini adalah hasil dari mengikat stdout (FD 1) dan stderr (FD 2) bersama-sama, sehingga keduanya pergi ke tujuan yang sama. Anda dapat melakukannya dengan shell Bourne seperti ini:

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

Jadi, jika Anda melihat-lihat /proc/$PID_OF_SOME_OTHER_PROGRAM/fd, Anda akan menemukan FD ketiga terpasang ke pipa dengan nomor inode yang sama seperti yang melekat pada FD 1 dan 2 sebagai some-programcontoh. Ini mungkin juga apa yang terjadi dengan FD 5 dan 6 dalam contoh Anda, tetapi saya tidak punya teori siap tentang bagaimana kedua FD ini terikat bersama. Anda harus tahu apa yang dilakukan program secara internal untuk mengetahuinya.

Warren Young
sumber
1
Contohnya, saya pikir, adalah pidgin- ada banyak pipa & soket dan hal-hal lain, jadi itu contoh yang bagus. Satu pertanyaan terakhir: inode hanya spesifik dalam konteks sistem file tertentu, benar? Seperti pada, saya dapat memiliki inode 3 pada /sistem file saya , dan yang lain (berbeda) inode 3 pada /bootsistem file saya .
Thanatos
4
Iya nih. Dalam kasus /procsistem file, nomor inode dibuat dengan cepat (lihat get_next_ino()di fs/inode.ckernel), mulai dari 0 ketika sistem baru saja di-boot. Mekanisme yang membuat mereka bersama oleh beberapa filesystem Linux impersistent (proc, configfs, ramfs, autofs ...) di antaranya nomor inode yang unik meskipun POSIX semantik tidak menuntut itu. Namun itu adalah kasus yang agak istimewa. Aturan yang Anda bicarakan biasanya direferensikan sehubungan dengan sistem file persisten normal seperti ext3.
Warren Young
33

Untuk soket, Anda dapat menemukan informasi lebih lanjut tentang inode di /proc/net/tcp, /proc/net/udpatau /proc/net/unix. Sebagai contoh:

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

Kita melihat inode adalah 53710569.

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

Dalam hal ini, ini adalah soket mendengarkan (tidak ada alamat jarak jauh), mendengarkan pada port lokal 27 (0x1B). Alamat IP adalah 4 byte dalam hex dalam "notasi jaringan", Anda dapat menggunakan inet_ntoafungsi untuk mengubahnya menjadi notasi abcd standar (dalam hal ini 127.0.0.1).

Perhatikan bahwa file-file ini tampaknya 0 byte tetapi memiliki konten jika Anda membacanya. Perhatikan juga bahwa -agrep diperlukan karena mereka mungkin (misalnya dengan unix) tampak biner.

Marki555
sumber
Ada juga /proc/net/tcp6dan /proc/net/udp6untuk IPv6.
Craig McQueen