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
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.
- 1. Utilisation de Django en tant que backend pour Cappuccino
- 2. Stdout lors de l'exécution de django en tant que fastcgi
- 3. Utilisation de TTreeview en tant que menu
- 4. Utilisation d'objets Type en tant que paramètres de type pour génériques en C#
- 5. Utilisation d'un objet en tant que clé de dictionnaire générique
- 6. Utilisation de la procédure stockée SQL en tant que données pour un rapport Microsoft Dynamics CRM
- 7. Utilisation de JQuery en tant que ressource Web intégrée ASP.NET
- 8. Utilisation des onglets JQuery en tant que navigation principale
- 9. Utilisation d'une table std :: map en tant que tableau associatif
- 10. Utilisation de Chromium en tant que MFC CWnd
- 11. Comment créer une page ASP.NET pour agir en tant que "proxy" pour Silverlight WebClient?
- 12. Comment puis-je compiler une extension pour PHP 5.3 pour Windows en tant que DLL?
- 13. Utilisation de VIM en tant que visualiseur de fichier journal
- 14. Utilisation d'une boîte à outils WPF DatePicker en tant que paramètre d'un ObjectDataProvider utilisé en tant que source d'éléments
- 15. Apache en tant que proxy inverse pour CouchDB
- 16. Squid en tant que proxy pour un site spécifique?
- 17. Outil pour afficher le html en tant que hiérarchie
- 18. JSFs: commandLink en tant que paramètre pour outputFormat
- 19. Comment faire pour Checkbox en tant que ColumnHeader de dataGridView
- 20. Flash en tant que passerelle socket pour javascript
- 21. Comment faire pour que git-svn utilise une branche svn particulière en tant que dépôt distant?
- 22. Inno Configuration en tant que bootstrapper pour .msi
- 23. .NET en tant que client, Java en tant que serveur
- 24. Comment écrire une méthode qui prend une adresse pour un pointeur en tant que paramètre?
- 25. Comment faire pour rediriger TO stdout?
- 26. Répertoires virtuels en tant que requêtes DB
- 27. UserControl en tant que tabItem
- 28. Utilisation de pages .aspx en tant que modèle HTML en dehors d'une requête HTTP ASP.NET 3.5
- 29. Utilisation d'une grille en tant qu'élément Items
- 30. Meilleure méthode pour exécuter une application Java en tant que démon * nix ou service Windows?