Buffering (named) pipe dans le operating system GNU

Dans le operating system GNU, un process ne peut écrire des données dans un canal que si un autre process lit les mêmes données (à partir du même canal) en même time.

Y a-t-il quelque chose comme un tuyau qui permet au premier process d'écrire et de tamponner datatables jusqu'à ce que le second le lise?

Un tuyau nommé (fifo) peut faire ce que vous voulez jusqu'à un certain point, mais avec quelques mises en garde:

  1. Si vous voulez pouvoir écrire dans le tube avant que le lecteur existe, votre graveur doit ouvrir le fifo en lecture-écriture ou l'appel à l' open bloquera. Dans le shell cela pourrait ressembler à ceci:

     exec 3<>/path/to/pipe echo "foo" >&3 cat <&3 

    Comme vous pouvez le voir, je peux écrire au tuyau avant que le lecteur ne soit là. Une fois que je lis de la pipe, les messages que j'ai écrits sont déjà là.

  2. Les écritures sur le tuyau finiront par bloquer une fois que le tuyau se remplira. Selon le tuyau (7) sur Linux:

Un tuyau a une capacité limitée. Si le tube est plein, une écriture (2) se bloquera ou échouera, selon que l'indicateur O_NONBLOCK est activé (voir ci-dessous). Différentes implémentations ont des limites différentes pour la capacité de la conduite. Les applications ne doivent pas s'appuyer sur une capacité particulière: une application doit être conçue de manière à ce qu'un process de lecture consum datatables dès qu'elles sont disponibles, de sorte qu'un process d'écriture ne soit pas bloqué.

Dans les versions Linux antérieures à la version 2.6.11, la capacité d'un tube était la même que la taille de la page système (par exemple 4096 octets sur i386). Depuis Linux 2.6.11, la capacité du canal est de 65536 octets.

Selon votre cas d'utilisation, vous pouvez également envisager d'utiliser une queue de messages. Le kernel fournit une queue de messages. Sous Linux, consultez mq_overview (7) pour un bon aperçu. Alternativement, les services comme RabbitMQ fournissent des files d'attente de messages avec une variété d'sets de fonctionnalités, y compris être utilisable sur un réseau.

Comme personne ne pouvait me montrer une application qui correspond à mes besoins, j'ai écrit la mienne .

Voulez-vous dire http://en.wikipedia.org/wiki/Named_pipe ? Cela fonctionne comme vous le requestz.