[LINUX] Un peu plus sur le FIFO

Qu'est-ce que FIFO

Le nom du tube est FIFO. C'est fini. ls -l | grep keyword Dans, | est le tube et le nom global du système de fichiers qui lui est donné est le FIFO. Les propriétés sont les mêmes que celles des tuyaux. Dans l'exemple ci-dessus

  1. grep démarre et bloque avec open (O_RDONLY) de pipe
  2. ls ouvre le tuyau avec ouvert (O_WRONLY)
  3. ls écrit la sortie dans pipe ()
  4. Le grep est débloqué et l'entrée est read ()
  5. Je ferme le tuyau ()
  6. grep ferme le tube ()

Cela devient un mouvement comme. Il bloque avec open (), pas avec read () ou write (). Ceci est écrit dans les pages de manuel japonaises, mais il est difficile à comprendre. En d'autres termes, c'est ça.

Les fichiers qui ne peuvent pas être recherchés (tubes et FIFO) commencent la lecture à partir de la position actuelle, et s'il n'y a pas de données, elles sont considérées comme EOF et 0 est renvoyé.

Par conséquent, read () ne bloque pas. Normalement, ce n'est pas un problème, mais si vous voulez configurer un thread pour la communication inter-processus et attendre que les données arrivent en boucle, vous devez le bloquer avec open () pour éviter de gaspiller le processeur. Cependant, en tant qu'être humain, je ne veux pas ouvrir () / fermer () dans chaque boucle. C'est mieux si vous pouvez bloquer avec read ().

Donc file d'attente de messages

La file d'attente de messages POSIX est une file d'attente qui peut stocker un nombre fini de messages de taille fixe. Puisque l'attribut de blocage est ajouté au moment de la création, même si la file d'attente est reçue (s'il s'agit d'une file d'attente de blocage), il se bloquera jusqu'à ce que le message arrive.

Par conséquent, il convient au traitement qui attend l'arrivée d'un message dans une boucle de thread. Il ne génère pas de SIGPIPE comme un tube, et il ne perd pas de données lorsque les deux extrémités du FIFO sont fermées (il conserve les données jusqu'à l'arrêt car c'est la durée de vie du noyau).

Échange de données entre processus

Il semble qu'il existe d'autres méthodes de communication inter-processus telles que le sémapho, le signal, la mémoire partagée, etc., mais je pense que ce sera FIFO, file d'attente ou socket de domaine lors de l'exécution à des fins d'échange de données. Je pense que chacun a ses avantages et ses inconvénients, alors j'aimerais les résumer à l'avenir.

Recommended Posts

Un peu plus sur le FIFO
Un peu plus sur les références ~ Prenant Python et Java comme exemples ~
J'ai réfléchi un peu à l'API grandissante de TensorFlow
Un mémorandum sur Nan.
Une note sur __call__
Une note sur le sous-processus
Une note sur mprotect (2)
Un peu d'informations addictives sur Cliff, le framework CLI
Lire un peu plus arch / arm / boot / compressé / Makefile
(Pour moi) Flask_2 (liste et pour, étend, et un peu plus)
Une note sur KornShell (ksh)
Une histoire un peu plus profonde sur la blockchain, le monde numérique
Mémorandum sur la corrélation [Python]
Une note sur TensorFlow Introduction
Un mémorandum sur le simulacre de Python
Un peu coincé dans le chainer
Une note sur [python] __debug__
Utilisons un peu plus Watson IoT Platform Data Store Connector
Après avoir fait des recherches sur la bibliothèque Python, j'ai un peu compris egg.info.
Une histoire rafraîchissante sur Slice en Python
[Java] Un petit comportement de scission mystérieux
Python: une note sur les classes 1 "Résumé"
Remarque à propos de get_scorer de sklearn
Une histoire de mauvaise humeur sur Slice en Python
J'ai une question sur les blancs
Un petit script pour l'autodéfense des logiciels malveillants
Rendre la compilation C un peu plus facile
L'histoire de l'utilisation de la réduction de Python
Une note sur mock (bibliothèque fictive Python)