2010-07-28 5 views
3

Il y a deux façons très simples pour laisser un programme envoyer un flux de données à un autre:techniques pour tuyaux infiniment longues

  • tuyau Unix, ou socket TCP, ou quelque chose comme ça. Cela nécessite une attention constante de la part du programme consommateur, ou un programme producteur bloquera. Même en augmentant les tampons de leurs valeurs par défaut minuscules, c'est toujours un énorme problème.
  • Fichiers plains - le programme producteur est ajouté avec O_APPEND, le consommateur lit juste quelles que soient les nouvelles données disponibles à sa convenance. Cela ne nécessite aucune synchronisation (tant que diskspace est disponible), mais les fichiers Unix ne supportent que la troncature à la fin, pas au début, donc ils rempliront le disque jusqu'à ce que les deux programmes se terminent.

Existe-t-il un moyen simple d'avoir les deux sens, avec les données stockées sur le disque jusqu'à ce qu'il soit lu, puis libéré? Évidemment, les programmes peuvent communiquer via un serveur de base de données ou quelque chose comme ça, et ne pas avoir ce problème, mais je cherche quelque chose qui s'intègre bien avec la tuyauterie Unix normale.

Répondre

0

Vous devriez lire quelques documentation on socat. Vous pouvez l'utiliser pour combler l'écart entre les sockets tcp, les fichiers fifo, les tubes, stdio et autres.

Si vous vous sentez paresseux, il y a some nice examples de commandes utiles.

+0

J'ai regardé la documentation, et il n'est pas évident de savoir comment utiliser socat pour ce que je veux. Disons que pour simplifier j'ai exactement un producteur et exactement un consommateur, et je veux un tuyau infini entre eux. Comment utiliser socat pour ça? – taw

3

Une solution laminée à la main relativement simple.

Vous pourriez demander au producteur de créer des fichiers et d'écrire jusqu'à ce qu'il atteigne une certaine taille/un certain nombre d'enregistrements, ce qui convient à votre application. Le producteur ferme ensuite le fichier et en lance un nouveau avec un algorithme de nommage convenu.

Le consommateur lit les nouveaux enregistrements à partir d'un fichier, puis lorsqu'il ferme la taille maximale convenue, il les ferme et les supprime, puis ouvre le suivant.

1

Si vos données peuvent être divisées en blocs ou en transactions de quelque sorte, vous pouvez utiliser la méthode de fichier pour cela avec un numéro de série. Le producteur de données stockerait le premier mégaoctet de données dans outfile.1, le suivant dans outfile.2 etc. Le consommateur peut lire les fichiers dans l'ordre et les supprimer lorsqu'ils sont lus. Ainsi, vous obtenez quelque chose comme votre deuxième méthode, avec le nettoyage en cours de route.

Vous devriez probablement tout inclure dans une bibliothèque, de sorte que du point de vue des applications, cette est un tuyau quelconque.

0

Je ne suis au courant de rien, mais il ne devrait pas être trop difficile d'écrire un petit utilitaire qui prend un répertoire comme argument (ou utilise $ TMPDIR); et utilise select/poll to multiplex entre la lecture de stdin, la pagination d'une série de fichiers temporaires et l'écriture sur stdout.