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?

Foi útil?

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.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top