Que signifie le symbole @ au début d'un chemin de socket de domaine unix sous Linux?

17

Lorsque j'exécute netstat --protocol unixou que lsof -Uje vois que certains chemins de socket Unix sont précédés du symbole @, par exemple, @ / tmp / dbus-qj8V39Yrpa . Ensuite, lorsque je cours, ls -l /tmpje ne vois pas de fichier nommé dbus-qj8V39Yrpa- bas.

La question est de savoir ce que ce symbole @ ajouté signifie? Et la deuxième question connexe est - où puis-je réellement trouver ce fichier de socket Unix ( @ / tmp / dbus-qj8V39Yrpa ) sur le système de fichiers?

Golem
la source
1
Pour ce qu'il vaut, le ssprogramme plus moderne montre également des points de terminaison de socket comme "@ / tmp / .X11-unix / X0"
Bruce Ediger

Réponses:

33

Le @indique probablement un socket détenu dans un abstract namespacequi n'appartient pas à un fichier du système de fichiers.

Citation de l' interface de programmation Linux par Michael Kerrisk :

57.6 L'espace de noms de socket abstrait Linux

Le soi-disant espace de noms abstrait est une fonctionnalité spécifique à Linux qui nous permet de lier une socket de domaine UNIX à un nom sans que ce nom soit créé dans le système de fichiers. Cela offre quelques avantages potentiels:

  • Nous n'avons pas à nous soucier des collisions possibles avec des noms existants dans le système de fichiers.
  • Il n'est pas nécessaire de dissocier le chemin d'accès du socket lorsque nous avons fini d'utiliser le socket. Le nom abstrait est automatiquement supprimé lorsque le socket est fermé.
  • Nous n'avons pas besoin de créer un chemin d'accès au système de fichiers pour le socket. Cela peut être utile dans un environnement chroot ou si nous n'avons pas accès en écriture à un système de fichiers.

Pour créer une liaison abstraite, nous spécifions le premier octet du champ sun_path comme un octet nul (\ 0). [...]

L'affichage d'un début null bytepour désigner ce type de socket peut être difficile, c'est peut-être la raison du @signe avant.

FloHimself
la source
2
Il est à noter que le caractère ASCII NUL est entré dans de nombreux terminaux comme ^ @ ([Ctrl] + [@]) et il peut apparaître comme ^ @ lorsqu'il est affiché par diverses commandes Unix (telles que GNU cat -a).
Jim Dennis
7

Selon man 7 unix

  • abstract: une adresse de socket abstraite se distingue par le fait que sun_path [0] est un octet nul ( \0). Tous les octets restants dans sun_path définissent le "nom" du socket. (Les octets nuls dans le nom n'ont aucune signification particulière.) Le nom n'a pas de connexion avec les chemins d'accès au système de fichiers. L'adresse de socket dans cet espace de noms est donnée par le reste des octets dans sun_path. Lorsque l'adresse d'une socket abstraite est retournée par getsockname (2), getpeername (2) et accept (2), sa longueur est sizeof (struct sockaddr_un) et sun_path contient le nom abstrait. L'espace de noms de socket abstrait est une extension Linux non portable.

On dirait que ceux-ci sont «abstraits» - donc aucun chemin réel n'est présent sur le système de fichiers

VenkatC
la source