Descripteur passant avec les sockets de domaine unix

Lorsque l’on veut passer d’un descripteur d’un enfant à un autre, UNP V1 (programmation réseau Unix V1) spécifie une procédure complexe pour ce faire, d’abord pour créer une structure msghdr, puis quelque chose, etc.

Pourquoi ne pouvons-nous pas passer un descripteur en tant que moyen de données normal alors que nous envoyons, recv pour d’autres données via des sockets de domaine Unix? Je suis capable de comprendre le processus. Veuillez expliquer la méthode donnée dans ce livre.

De plus, dans ce livre, dans la fonction read_fd (), il déclare l’union pour aligner correctement la structure msghdr. Comment l’union le rend-il aligné? et pourquoi l’alignement est-il nécessaire?

Pourquoi ne pouvons-nous pas passer un descripteur en tant que moyen de données normal alors que nous envoyons, recv pour d’autres données via des sockets de domaine Unix?

Parce qu’un descripteur de fichier ouvert n’est pas sérialisable sous forme de stream d’octets.

Alors que les descripteurs de fichiers ne sont en fait que des entiers, ils sont mappés par le kernel (de manière processuelle ) aux structures de données internes au kernel qui décrivent les détails du fichier ouvert (est-ce un fichier “normal”? / caractère dispositif spécial? Est-ce une prise réseau de quelque sorte? Est-ce un tuyau anonyme? etc.). Le passage du descripteur de fichier a pour but de créer un nouveau descripteur de fichier (probablement avec une autre valeur entière) dans un autre processus (éventuellement non lié) mappé sur la même structure de données interne au kernel que le descripteur d’origine du processus d’envoi.

Les machinations que vous devez effectuer pour ce faire sont juste “l’API” pour accéder à cette fonctionnalité (notez que les systèmes Unix basés sur System V utilisent une autre méthode de descripteur de fichier basée sur STREAMS, qui utilise une “API” différente). Je ne connais pas l’historique, mais je suppose que la “complexité” du descripteur de fichier BSD qui passe “API” est due au changement de fonctionnalité dans l’API sendmsg(2)/recvmsg(2) préexistante.

Comment l’union le rend-il aligné? et pourquoi l’alignement est-il nécessaire?

Je n’ai pas la mise en œuvre de l’UNP devant moi, mais utiliser un syndicat n’est pas la seule solution. L’exemple de portlisten de Kragen Sitaker utilise les macros CMSG_ * au lieu d’une union. L’idée est de s’assurer que .msg_control pointe vers .

Sans avoir un exemplaire de ce livre, il nous sera difficile de vous expliquer la méthode donnée dans le livre.

Il existe plusieurs techniques générales pour transmettre un descripteur de fichier d’un processus parent à un processus enfant. Si vous connaissez le numéro du descripteur de fichier avant de lancer l’enfant:

  • le mettre dans un paramètre de ligne de commande
  • le mettre dans une variable d’environnement
  • mettez-le dans un fichier sur le disque (pas une bonne option)

Si vous ne connaissez le descripteur de fichier qu’après le lancement de l’enfant, une sorte d’IPC sera nécessaire:

  • mettez-le en mémoire partagée
  • l’envoyer à l’enfant sur une prise

On dirait que le livre que vous lisez décrit la dernière option. Lorsque vous envoyez un message à un enfant, vous êtes libre de choisir la représentation de toutes les données que vous envoyez. Si vous envoyez un descripteur de fichier (un entier) et aucune autre information, vous êtes libre de choisir à peu près n’importe quelle représentation. Une représentation ASCII de l’entier peut être appropriée ou vous pouvez envoyer quatre octets représentant un entier de 32 bits.

Encore une fois, il est difficile de deviner pourquoi l’auteur du livre fait les choses telles qu’elles sont, sans savoir en quoi consiste la méthode.