Après avoir regardé un socket nommé unix et j'ai pensé qu'ils étaient nommés tubes. J'ai regardé les tuyaux de nom et je n'ai pas vu beaucoup de différence. J'ai vu qu'ils étaient initialisés différemment mais c'est la seule chose que je remarque. Les deux utilisent la fonction d'écriture / lecture C et fonctionnent de la même manière AFAIK.
Quelle est la différence entre les sockets de domaine Unix et les tubes nommés? Quand devrais-je choisir l'un sur l'autre? Lequel dois-je utiliser par défaut (comme comment utiliser le vecteur par défaut en C ++ plutôt que d'utiliser deque, list ou quoi que ce soit d'autre si j'ai des besoins)?
Réponses:
Les sockets de domaine UNIX sont généralement plus flexibles que les canaux nommés. Certains de leurs avantages sont:
Pour utiliser un grand nombre de ces fonctionnalités, vous devez utiliser la
send()
/recv()
famille d'appels système plutôt quewrite()
/read()
.la source
open(2)
appels ordinaires , ce qui les rend plus adaptés à la construction de pipelines ad hoc entre des programmes qui ne prennent normalement que des arguments de nom de fichier.Une différence est que les canaux nommés sont à sens unique, vous devrez donc en utiliser deux pour établir une communication bidirectionnelle. Les prises sont bien sûr bidirectionnelles. Il semble un peu plus compliqué d'utiliser deux variables au lieu d'une (c'est-à-dire deux tubes au lieu d'un socket).
En outre, l'article de wikipedia est assez clair sur le point suivant : «Les sockets de domaine Unix peuvent être créés sous forme de flux d'octets ou de séquences de datagrammes, tandis que les tubes sont uniquement des flux d'octets.
Les canalisations nommées sont en fait bidirectionnelles mais semi-duplex . Cela signifie que la communication peut aller soit de l'extrémité A à l'extrémité B, soit de B à A, mais jamais les deux en même temps.
la source
write
appel produit unread
appel. En mode flux, les données peuvent être concaténées ensemble dans un long flux, de sorte que de nombreuses écritures peuvent être lues à la fois, ou vice versa. (Windows a des tuyaux de datagramme, selon la réponse de jtoberon, Unix n'a pas)