Existe-t-il un fichier pour chaque socket?


21

"Tout est un fichier" dans le monde UNIX.

La phrase ci-dessus est célèbre. Quand je cours echo "hello programmer" >> /dev/tty1, je peux regarder la chaîne donnée TeleType 1 , ....

Quoi et où est le fichier pour chacun socket? Supposons que mon ami se connecte à mon PC et que son adresse IP soit h.h.h.h, comment puis-je accéder au fichier respectif? C'est possible?


3
L'API socket est en fait une déviation de la "politique Unix" à cet égard, car elle provenait à l'origine de BSD . Notez qu'il y a toujours le Plan 9 de Bell Labs qui est "plus Unix qu'Unix" - même le réseau et les API graphiques y sont des fichiers.
ntoskrnl

les sockets et les processus sont assez souvent mentionnés dans les articles du Plan 9, évoquant principalement où le modèle UNIX s'est mal passé.
strugee

Réponses:


9

man 7 unix:

La famille de sockets AF_UNIX (également appelée AF_LOCAL) est utilisée pour communiquer efficacement entre les processus sur la même machine. Traditionnellement, les sockets de domaine UNIX peuvent être soit sans nom, soit liés à un chemin d'accès au système de fichiers (marqué comme étant de type socket). Linux prend également en charge un espace de noms abstrait qui est indépendant du système de fichiers.

C'est-à-dire que chaque socket ne peut pas être considéré comme un fichier (dans le sens de "pas de fichier sans nom de fichier").

Mais il y a des fichiers avec des listes de sockets (par exemple /proc/net/tcp); pas exactement ce que signifie "tout est un fichier".


38

Une socket est un fichier. Mais tous les fichiers n'ont pas de nom. Voici quelques exemples de fichiers sans nom:

  • Tout fichier qui portait un nom et qui est maintenant supprimé, mais est toujours ouvert par un programme.
  • Un tube sans nom , tel que celui créé par l' |opérateur shell.
  • La plupart des sockets : tout socket Internet ou socket Unix qui ne se trouve pas dans l'espace de noms du système de fichiers (il peut être dans l'espace de noms abstrait ou sans nom).

Des fichiers tels que des canaux ou des sockets sans nom sont créés par un processus et ne sont accessibles que dans ce processus ou dans des processus enfants créés ultérieurement. (Ce n'est pas tout à fait vrai: un processus qui a un canal ou une socket (ou tout autre fichier) ouvert peut le transmettre à d'autres processus via une socket Unix; c'est ce que l'on appelle le passage de descripteur de fichier .)

Les sockets qui ont un nom (que ce soit dans le système de fichiers ou dans le résumé) peuvent être ouvertes en utilisant ce nom. Les sockets réseau peuvent être ouvertes (ou plus précisément connectées à) à distance à partir de n'importe quelle machine disposant d'une connectivité appropriée.


Ceci est la bonne réponse.
jforberg

4
/proc/<pid>/fd/*et /proc/net/*peut être intéressant
n611x007

Veuillez accepter cette réponse. Il est à mon humble avis beaucoup plus précis.
user1202136

13

Quoi et où est le fichier pour chaque socket?

"Tout" est une exagération. Ce n'est pas une politique stricte, c'est juste une pratique courante d'utiliser le système de fichiers pour les interfaces car l'accès au système de fichiers est synonyme d'appels système (c'est-à-dire que le système de fichiers est vraiment une interface avec le noyau, et fournit donc un format pratique pour toutes sortes de choses) . D'autres systèmes d'exploitation n'en font pas autant usage, c'est donc considéré comme une caractéristique distinctive.

Comme le mentionne Hauke ​​Laging, les sockets "unix local" ont un nœud de fichier comme le font les canaux nommés (voir man fifo). Cependant, les sockets de protocole Internet (utilisées pour la communication réseau) ne le font pas. Au lieu de cela, ils sont associés dans l'espace utilisateur à un numéro de port. Notez qu'un socket serveur sur un seul port connecte plusieurs clients chacun avec leur propre socket individuel (un seul fichier de socket local unix peut également être utilisé de cette façon avec un serveur, ce qui signifie qu'il peut y avoir plusieurs sockets associés à la même adresse de fichier) et dans le code, ils sont en fait identifiés individuellement via des descripteurs de fichiers numériques séparés .

Donc, dans ce sens, toutes les sockets ressemblent beaucoup à des fichiers et ont un lien /proc/[pid]/fd/. Vous pouvez même appeler readlink()cet inode et obtenir une sorte spéciale de nom de fichier, qui est utilisé dans les outils de ligne de commande tels que lsof, je crois; de même, vous pouvez obtenir des informations sur le descripteur de socket via fstat().


Vous voulez dire "identifié dans l'espace utilisateur par son inode"? Toutes les sockets n'ont pas de numéro de port et il peut y avoir plusieurs sockets pour le même numéro de port (cela n'a cependant aucun sens).
Hauke ​​Laging

@HaukeLaging: Bon point. J'ai édité pour rendre cela plus clair en commençant par le deuxième paragraphe.
goldilocks
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.