"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?
Réponses:
man 7 unix:
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".la source
Une socket est un fichier. Mais tous les fichiers n'ont pas de nom. Voici quelques exemples de fichiers sans nom:
|
opérateur shell.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.
la source
/proc/<pid>/fd/*
et/proc/net/*
peut être intéressant"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 appelerreadlink()
cet inode et obtenir une sorte spéciale de nom de fichier, qui est utilisé dans les outils de ligne de commande tels quelsof
, je crois; de même, vous pouvez obtenir des informations sur le descripteur de socket viafstat()
.la source