Saya ingin menentukan proses mana yang memiliki ujung lain dari soket UNIX.
Secara khusus, saya bertanya tentang yang dibuat dengan socketpair()
, meskipun masalahnya sama untuk semua soket UNIX.
Saya memiliki program parent
yang membuat socketpair(AF_UNIX, SOCK_STREAM, 0, fds)
, dan fork()
s. Proses induk menutup fds[1]
dan menyimpan fds[0]
untuk berkomunikasi. Anak melakukan sebaliknya, close(fds[0]); s=fds[1]
. Kemudian anak exec()
s program lain, child1
. Keduanya dapat berkomunikasi bolak-balik melalui socketpair ini.
Sekarang, katakanlah saya tahu siapa parent
adalah, tapi saya ingin mencari tahu siapa child1
adalah. Bagaimana cara melakukannya?
Ada beberapa alat yang saya miliki, tetapi tidak ada yang dapat memberi tahu saya proses mana yang ada di ujung soket yang lain. Saya sudah mencoba:
lsof -c progname
lsof -c parent -c child1
ls -l /proc/$(pidof server)/fd
cat /proc/net/unix
Pada dasarnya, saya dapat melihat dua soket, dan segala sesuatu tentang mereka, tetapi tidak dapat mengatakan bahwa mereka terhubung. Saya mencoba menentukan FD mana di induk yang berkomunikasi dengan proses anak mana.
Jawaban yang Diterima:
Sejak kernel 3.3, dimungkinkan menggunakan ss
atau lsof-4.89
atau lebih tinggi — lihat jawaban Stéphane Chazelas.
Dalam versi yang lebih lama, menurut penulis lsof
, tidak mungkin untuk mengetahuinya:kernel Linux tidak mengekspos informasi ini. Sumber:utas 2003 di comp.unix.admin.
Nomor yang ditampilkan di /proc/$pid/fd/$fd
adalah nomor inode soket di sistem file soket virtual. Saat Anda membuat pasangan pipa atau soket, masing-masing ujung secara berurutan menerima nomor inode. Angka-angka diatribusikan secara berurutan, jadi ada kemungkinan besar bahwa angka-angka tersebut berbeda 1, tetapi ini tidak dijamin (baik karena soket pertama adalah N dan N +1 sudah digunakan karena pembungkusan, atau karena beberapa utas lain dijadwalkan di antara dua alokasi inode dan utas itu juga membuat beberapa inode).
Saya memeriksa definisi socketpair
di kernel 2.6.39, dan kedua ujung soket tidak berkorelasi kecuali oleh socketpair
tipe khusus metode. Untuk soket unix, itu unix_socketpair
di net/unix/af_unix.c
.