Linux Path Socket – What Does the @ Symbol Denote in a Unix Domain Socket Path?

linuxpathsocket

When I run netstat --protocol unix or lsof -U I see that some unix socket paths are prepended with @ symbol, for example, @/tmp/dbus-qj8V39Yrpa. Then when I run ls -l /tmp I don't see file named dbus-qj8V39Yrpa there.

The question is what does that prepended @ symbol denote? And second related question, is — where can I actually find that unix socket file (@/tmp/dbus-qj8V39Yrpa) on the filesystem?

Best Answer

The @ probably indicates a socket held in an abstract namespace which doesn't belong to a file in the filesystem.

Quoting from The Linux Programming Interface by Michael Kerrisk:

57.6 The Linux Abstract Socket Namespace

The so-called abstract namespace is a Linux-specific feature that allows us to bind a UNIX domain socket to a name without that name being created in the file system. This provides a few potential advantages:

  • We don’t need to worry about possible collisions with existing names in the file system.
  • It is not necessary to unlink the socket pathname when we have finished using the socket. The abstract name is automatically removed when the socket is closed.
  • We don’t need to create a file-system pathname for the socket. This may be useful in a chroot environment, or if we don’t have write access to a file system.

To create an abstract binding, we specify the first byte of the sun_path field as a null byte (\0). [...]

Displaying a leading null byte to denote such type of a socket may be difficult, so that is maybe the reason for the leading @ sign.

Related Question