Pregunta

Me gustaría para ejecutar aplicaciones de línea de comandos arbitraria y leer su salida estándar, ya que se produjo. Utilizo CreateNamedPipe para crear un tubo y luego suministrar el otro extremo (abrir CreateFile usado) para CreateProcess. Siempre y cuando el proceso de destino no se manipula de forma explícita con el búfer de salida estándar es que hay una manera de asegurarse de que la tubería en cuestión es unbufferred o al menos que el mínimo del sistema se utiliza como tamaño del búfer?

¿Fue útil?

Solución

Realmente no se puede controlar los tamaños de búfer. Puede pasar en lectura y escritura tamaños de búfer de 1 a CreateNamedPipe, pero el núcleo aumentará automáticamente los tamaños de búfer. Básicamente, el buffer siempre será al menos tan grande como la mayor cantidad de datos que ha sido preparado para leer en cualquier momento dado. Dicho de otra manera, más rápido respondía cuando se dispone de datos, y el más pequeño de los bloques de datos escritos a la tubería, menor será el búfer se mantendrá.

  

Los tamaños de entrada y de salida de amortiguamiento son de asesoramiento. El tamaño del búfer actual reservado para cada extremo de la tubería con nombre es o bien el valor predeterminado del sistema, el mínimo o máximo del sistema, o el tamaño especificado redondeado al siguiente límite de asignación. ... Cada vez que se produce una operación de escritura de canalización, el sistema intenta cargar la memoria de la cuota tubería de escritura en primer lugar. ... Si la cuota de escritura tubería restante es demasiado pequeño para cumplir con la solicitud, el sistema intenta expandir los tampones para dar cabida a los datos utilizando no paginado reservada para el proceso.

Sin embargo, no creo que los tamaños de búfer son realmente importantes. Tuberías no retrasan el envío de datos hasta que el búfer está "llena", y no hay nada equivalente a la opción "Nagle" para TCP, por lo que mantener un pequeño tamaño de búfer no mejorará su latencia.

Tenga en cuenta que cuando se conecta a un tubo stdout de una aplicación de consola, la salida está amortiguada por lo general que la aplicación antes que está escrito en la tubería. Si desea una salida sin búfer, tendrá que utilizar stderr.

Además, algo a tener en cuenta cuando se utiliza tubería heredada maneja es que la aplicación generada heredará todas sus manijas, así que si usted tiene un archivo o un socket abierto, generar una aplicación, a continuación, cierre de la manilla, el archivo / socket / etc. permanecerá abierta hasta que se detenga el proceso hijo engendrado, que puede conducir a violaciónes de intercambio inesperados y otros problemas extraños.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top