CreateNamedPipe não sofrido para uso como stdout para CreateProcess
-
21-09-2019 - |
Pergunta
Gostaria de executar o aplicativo arbitrário da linha de comando e ler sua saída padrão à medida que é produzido. eu uso CreateNamedPipe
Para criar um tubo e depois fornecer outra extremidade (aberto usado CreateFile
) para CreateProcess
. Desde que o processo de destino não manipula explicitamente com o buffer de saída padrão, existe uma maneira de garantir que o tubo em questão seja inabalável ou pelo menos que o mínimo do sistema seja usado como tamanho do buffer?
Solução
Você não pode realmente controlar os tamanhos do buffer. Você pode passar tamanhos de tampão de leitura e gravação de 1 para CreateNamedPipe
, mas o kernel aumentará automaticamente esses tamanhos de buffer. Basicamente, o buffer sempre será pelo menos tão grande quanto a maior quantidade de dados que estão prontos para ler a qualquer momento. Em outras palavras, mais rápido você responde aos dados disponíveis e quanto menor os blocos de dados gravados no tubo, menor o buffer permanecerá.
Os tamanhos de buffer de entrada e saída são consultivos. O tamanho real do buffer reservado para cada extremidade do tubo nomeado é o padrão do sistema, o mínimo ou o máximo do sistema ou o tamanho especificado arredondado para o próximo limite de alocação. ... Sempre que uma operação de gravação de tubo ocorre, o sistema primeiro tenta carregar a memória na cota de gravação do tubo. ... Se a cota de gravação do tubo restante for muito pequena para atender à solicitação, o sistema tentará expandir os buffers para acomodar os dados usando o pool não picado reservado para o processo.
No entanto, não acho que os tamanhos de buffer sejam realmente importantes. Os tubos não atrasam o envio de dados até que o buffer esteja "cheio", e não há nada equivalente à opção "Nagle" para o TCP, portanto, manter um tamanho de buffer pequeno não melhorará sua latência.
Lembre -se de que quando você conecta um tubo a um aplicativo de console stdout
, a saída é normalmente tamponada por esse aplicativo antes da está escrito para o tubo. Se você deseja uma saída sem buffer, precisará usar o Stderr.
Além disso, algo a ser observado ao usar alças de tubulação herdadas é que o aplicativo gerado herdará todas as suas alças; portanto, se você tiver um arquivo ou um soquete aberto, gerará um aplicativo e fechará esse identificador, o arquivo/soquete/etc . permanecerá aberto até que o processo infantil gerado pare, o que pode levar a violações inesperadas de compartilhamento e outros problemas estranhos.