UNIX/Linux CIB : Lecture à partir d'un tuyau. Comment savoir la longueur de données au moment de l'exécution?

J'ai un enfant de processus qui génère de la sortie de longueur variable et l'envoie ensuite le parent à l'aide d'un semi-duplex pipe. Dans le parent, comment puis-je utiliser le lire() la fonction?
Puisque les données peuvent être de longueur différente à chaque fois, comment puis-je au moment de l'exécution de connaître la taille des données à n'importe quel malloc() pour un tampon? Peut le fstat() fonction être utilisé sur une conduite d'un descripteur de fichier?

Je sais que la lecture() va lire un nombre spécifié d'octets, mais sera de retour 0 si la fin de fichier (pas le caractère EOF) est atteint avant que les octets demandés ont été lus.

Je suis spécifiquement Ubuntu GNU/Linux avec un 2.6.27-9 du Noyau.

Tous les exemples de Richard Stevens " Advanced Programming in the UNIX Environment avez spécifié la longueur des données lors de l'écriture dans la tuyauterie ou ont compté sur fgets() stdio.h fonction. Depuis que je suis préoccupé par la vitesse, je veux rester loin de l'aide de stdio.h autant que possible.

Ce que ce sera nécessairement plus rapide avec de la mémoire partagée?

Grâce,
-Dhruv

Merci à tous pour vos réponses. Le processus de l'enfant qui envoie des données sur le canal de communication est essentiellement la execed sortie d'un outil qui répertorie quelques statistiques sur le système. À chaque fois, la durée de la sortie est différente. J'ai dupliqué la sortie standard (STDOUT) à la fin d'écriture de la conduite chez l'enfant. Ma compréhension est que le processus de l'enfant après execing l'outil va automatiquement mettre à la sortie de l'écriture, à la fin de la pipe comme je l'ai dupliqué la sortie standard (STDOUT). Une fois que j'ai fini l'attente dans le parent, je devrais être capable de lire les données à partir de la pipe avec read(). Comment obtenir la longueur pour lire() parent?
Je vais faire un peu d'analyse sur la collecte à la sortie. Depuis la sortie de l'outil est très bien mis en forme avec des retours à la ligne et les espaces, j'ai pu le faire beaucoup plus facilement et efficacement en parcourant la mémoire tampon à l'aide de pointeurs que le stockage intermédiaire des données dans un fichier sur le disque, puis avec de la ficelle.h des fonctions comme sscanf(). Je me demandais si en faisant successives lseek() sur le tuyau sera d'aucune aide pour obtenir la taille des données.
Veuillez lire la mise à jour de ma réponse. Il vous montrera ce que vous devez faire si vous souhaitez lire les données qu'il devient disponible.
Vous ne pouvez pas utiliser lseek() sur un tuyau. Même si elle a un descripteur de fichier et agit un peu comme un fichier, une pipe n'est pas un fichier de plus qu'un socket.

OriginalL'auteur Dhruv | 2009-07-19