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?
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.
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]
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.
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/boot
sistem file saya ./proc
sistem file, nomor inode dibuat dengan cepat (lihatget_next_ino()
difs/inode.c
kernel), 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.Untuk soket, Anda dapat menemukan informasi lebih lanjut tentang inode di
/proc/net/tcp
,/proc/net/udp
atau/proc/net/unix
. Sebagai contoh:Kita melihat inode adalah 53710569.
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_ntoa
fungsi 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
-a
grep diperlukan karena mereka mungkin (misalnya denganunix
) tampak biner.sumber
/proc/net/tcp6
dan/proc/net/udp6
untuk IPv6.