GNU/Linux >> Belajar Linux >  >> Linux

Siapa yang Punya Ujung Lain Dari Socketpair Unix Ini?

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 .


Linux
  1. Meninjau kembali filosofi Unix di 2018

  2. ^M di akhir setiap baris di vim

  3. erlang:Dukungan soket domain UNIX?

  1. Bagaimana cara menggunakan opsi SO_KEEPALIVE dengan benar untuk mendeteksi bahwa klien di ujung lain sedang down?

  2. Bagaimana mengkonversi string ke integer di UNIX

  3. Bagaimana opsi '-s', '-t', dan '-c' dari perintah tr bekerja di Unix?

  1. Linux vs. Unix:Apa bedanya?

  2. Apakah filosofi Linux masih relevan di tahun 2019?

  3. Bagaimana cara menambahkan baris baru ke akhir file?