Que signifie “lisible / enregistrable” dans un descripteur de fichier de socket? Et pourquoi les fichiers normaux ne se soucient pas de cela?

Depuis que je commence à apprendre libev récemment, il existe un concept lisible / inscriptible dans io_watcher que je ne comprends pas tout à fait. Pour ma connaissance, il existe un paramètre dans la programmation système Linux:

O_ASYNC

Un signal (SIGIO par défaut) sera généré lorsque le fichier spécifié sera lisible ou inscriptible. Cet indicateur est disponible uniquement pour les terminaux et les sockets, pas pour les fichiers normaux.

Donc, puisqu’un fichier ordinaire ne se soucie pas de lire / écrire, que signifie vraiment lisible / écrire dans une programmation par socket? Et quelle mesure le kernel a-t-il prise pour savoir si un descripteur de fichier de socket est lisible?

Compte tenu de la philosophie du tout-est-un-fichier, chaque descripteur de socket avec un numéro de descripteur différent pointe-t-il réellement vers le même fichier? Si oui, puis-je considérer que le problème de lecture / écriture est causé par la synchronisation?

OK, il semble que j’ai posé une question idiote. Ce que je veux vraiment dire, c’est que le socket et le fichier normal lisent et écrivent via un descripteur de fichier, alors pourquoi le descripteur de socket a un concept lisible / inscriptible, mais non le fichier normal. Puisque EJP m’a dit que c’était parce que le tampon et chaque descripteur avaient leur propre paire de tampons, voici ma conclusion: le concept lisible / enregistrable est pour les tampons, si un tampon est vide, il est illisible, alors qu’il est plein, non lisible. lisible et inscriptible n’a rien à voir avec la synchronisation, et comme un fichier normal n’a pas de tampon, il est toujours lisible et inscriptible.

Et il y a plus de questions: en disant tampon de réception, ce tampon n’est pas la même chose dans int recv(SOCKET socket, char FAR* buf, int len, int flags); , droite?

Lisible signifie qu’il y a des données ou une FIN dans le tampon de réception du socket.

Enregistrable signifie qu’il y a de la place disponible dans le tampon d’envoi de socket.

Les fichiers n’ont pas de socket envoyer ou recevoir des tampons.

Considérant la philosophie du tout-est-un-fichier

Quelle philosophie est-ce?

chaque descripteur de socket avec un numéro de descripteur différent pointe-t-il réellement vers le même fichier?

Quel fichier? Pourquoi indiqueraient-ils le même chose? La question n’a pas de sens.

Je suis confus avec une chose: quand un socket est créé, le descripteur est en fait pointer sur les tampons de réception et d’envoi du socket

Il pointe vers beaucoup de choses: une adresse source, une adresse cible, un port source, un point cible, une paire de mémoires tampons, un ensemble de compteurs et de timers, …

le fichier ne représente pas le matériel net.

Le fichier représentant le matériel réseau n’existe pas, sauf si vous parlez de l’entrée du pilote de périphérique dans /dev/... , qui est à peine pertinente. Un socket TCP est un point d’extrémité d’une connexion. Il est spécifique à cette connexion, à TCP, aux adresses et ports source et cible, …