Apa yang dilambangkan dengan simbol @ di awal lintasan soket domain unix di Linux?

17

Ketika saya menjalankan netstat --protocol unixatau lsof -Usaya melihat bahwa beberapa jalur soket unix diawali dengan simbol @, misalnya, @ / tmp / dbus-qj8V39Yrpa . Kemudian ketika saya menjalankan ls -l /tmpsaya tidak melihat file bernama dbus-qj8V39Yrpa di sana.

Pertanyaannya adalah apa yang dilambangkan dengan simbol @ yang berurutan itu? Dan pertanyaan kedua yang terkait, adalah - di mana saya benar-benar dapat menemukan file soket unix ( @ / tmp / dbus-qj8V39Yrpa ) pada sistem file?

golem
sumber
1
Untuk apa nilainya, program yang lebih modern ssjuga menunjukkan titik akhir soket seperti "@ / tmp / .X11-unix / X0"
Bruce Ediger

Jawaban:

33

Yang @mungkin menunjukkan soket yang disimpan dalam abstract namespaceyang bukan milik file di sistem file.

Mengutip dari The Linux Programming Interface oleh Michael Kerrisk :

57.6 Linux Abstract Socket Namespace

Yang disebut namespace abstrak adalah fitur spesifik Linux yang memungkinkan kita untuk mengikat soket domain UNIX ke nama tanpa nama itu dibuat dalam sistem file. Ini memberikan beberapa potensi keuntungan:

  • Kami tidak perlu khawatir tentang kemungkinan tabrakan dengan nama yang ada di sistem file.
  • Tidak perlu untuk memutuskan tautan socket pathname ketika kita selesai menggunakan socket. Nama abstrak dihapus secara otomatis ketika soket ditutup.
  • Kita tidak perlu membuat pathname sistem file untuk socket. Ini mungkin berguna dalam lingkungan chroot, atau jika kita tidak memiliki akses tulis ke sistem file.

Untuk membuat pengikatan abstrak, kami menetapkan byte pertama bidang sun_path sebagai byte nol (\ 0). [...]

Menampilkan null bytearahan untuk menunjukkan jenis soket seperti itu mungkin sulit, sehingga mungkin merupakan alasan untuk @tanda utama .

FloHimself
sumber
2
Perlu dicatat bahwa karakter ASCII NUL dimasukkan di banyak terminal sebagai ^ @ ([Ctrl] + [@]) dan dapat muncul sebagai ^ @ ketika ditampilkan oleh berbagai perintah Unix (seperti GNU cat -a).
Jim Dennis
7

Sesuai man 7 unix

  • abstract: alamat soket abstrak dibedakan oleh fakta bahwa sun_path [0] adalah byte nol ( \0). Semua byte yang tersisa di sun_path menentukan "nama" dari soket. (Null byte dalam nama tidak memiliki arti khusus.) Nama tidak memiliki koneksi dengan nama path sistem file. Alamat soket di namespace ini diberikan oleh sisa byte di sun_path. Ketika alamat soket abstrak dikembalikan oleh getsockname (2), getpeername (2), dan accept (2), panjangnya adalah sizeof (struct sockaddr_un), dan sun_path berisi nama abstrak. Socket namespace abstrak adalah ekstensi Linux yang tidak portabel.

Sepertinya ini 'abstrak' - jadi tidak ada jalur nyata di sistem berkas

VenkatC
sumber