2009-10-14 8 views
4

Je voudrais exécuter une application de ligne de commande arbitraire et lire sa sortie standard au fur et à mesure de sa production. J'utilise CreateNamedPipe pour créer un tuyau et ensuite fournir l'autre extrémité (ouvrir utilisé CreateFile) à CreateProcess. Pourvu que le processus cible ne soit pas explicitement manipulé avec la mise en mémoire tampon de sortie standard, y a-t-il un moyen de s'assurer que le canal en question n'est pas condensé ou du moins que le minimum système est utilisé comme taille de tampon?CreateNamedPipe non-buffer pour une utilisation en tant que stdout pour CreateProcess

Répondre

4

Vous ne pouvez pas vraiment contrôler les tailles de mémoire tampon. Vous pouvez passer en lecture et en écriture les tailles de tampon de 1 à CreateNamedPipe, mais le noyau augmentera automatiquement ces tailles de tampon. Fondamentalement, le tampon sera toujours au moins aussi grand que la plus grande quantité de données qui a été prête à lire à un moment donné. En d'autres termes, plus vite vous répondez aux données disponibles, et plus les blocs de données écrits sur le tuyau sont petits, plus le tampon restera petit.

Les tailles des tampons d'entrée et de sortie sont indicatives. La taille réelle de la mémoire tampon réservée pour chaque extrémité du canal nommé est la valeur par défaut du système, le minimum ou le maximum du système ou la taille spécifiée arrondie à la limite d'allocation suivante. ... Chaque fois qu'une opération d'écriture de tuyau se produit, le système essaie d'abord de charger la mémoire dans le quota d'écriture de tuyau. ... Si le quota d'écriture de tuyau restante est trop petit pour satisfaire la demande, le système essaiera d'étendre les tampons pour accommoder les données en utilisant un pool non paginé réservé au processus.

Cependant, je ne pense pas que les tailles de tampon sont vraiment importantes. Les tubes ne retardent pas l'envoi de données jusqu'à ce que le tampon soit "plein", et il n'y a rien d'équivalent à l'option "nagle" pour TCP, donc maintenir une petite taille de buffer n'améliorera pas votre latence. Gardez à l'esprit que lorsque vous connectez un canal aux ports stdout d'une console, la sortie est généralement mise en mémoire tampon par l'application avant avant d'être écrite dans le canal. Si vous voulez une sortie sans tampon, vous devrez utiliser stderr. En outre, lorsque vous utilisez des poignées de tuyaux héritées, l'application générée héritera de toutes vos poignées. Ainsi, si vous avez un fichier ou un socket ouvert, vous créez une application, puis fermez ce handle, le fichier./socket/etc restera ouvert jusqu'à ce que le processus enfant engendré s'arrête, ce qui peut entraîner des violations de partage inattendues et d'autres problèmes étranges.

Questions connexes