Existe uma maneira de redirecionar a saída padrão de um processo no console do Win32 para um pipe nomeado ? Os pipes nomeados são incorporados ao Windows e, embora sejam um conceito útil, nunca os vi usados na linha de comando.
Ou seja. gosto example.exe >\\.\mypipe
. (Essa sintaxe pode não estar correta, mas você entendeu.) Gostaria de poder redirecionar stdout e stderr para diferentes pipes ao mesmo tempo.
Eu gostaria de evitar o uso de arquivos físicos como substituto, para evitar lidar com lentidão de E / S, buffers de E / S, bloqueios de arquivo, direitos de acesso, espaço disponível no disco rígido, decisão de sobrescrever, persistência não sigilosa etc.
Outra razão é porque o conjunto tradicional de ferramentas do Windows não é projetado em torno de uma filosofia baseada em arquivo (texto) tanto quanto no Unix . Além disso, os pipes nomeados não podem ser facilmente montados no Windows, se houver.
Finalmente, há a curiosidade de saber se um bom conceito pode ser utilizado.
fonte
Respostas:
Não sei por que você não deseja redirecionar para um arquivo. Existem dois métodos que fornecerei aqui. Um método é redirecionar e ler de um arquivo, o outro é um conjunto de programas.
Canais nomeados
O que fiz foi escrever dois programas para o .NET 4. Um envia a saída para um pipe nomeado, o outro lê esse pipe e é exibido no console. O uso é bastante simples:
Em outra janela do console:
Infelizmente, isso só pode redirecionar
stdout
(oustdin
ou combinar), nãostderr
por si só, devido a limitações no operador de pipe (|
) no prompt de comando do Windows. Se você descobrir como enviarstderr
através desse operador de tubo, ele deverá funcionar. Como alternativa, o servidor pode ser modificado para iniciar seu programa e redirecionar especificamentestderr
. Se necessário, informe-me em um comentário (ou faça você mesmo); não é muito difícil se você tiver algum conhecimento da biblioteca "Process" em C # e .NET.Você pode baixar o servidor e o cliente .
Se você fechar o servidor após a conexão, o cliente fechará imediatamente. Se você fechar o cliente após a conexão, o servidor será fechado assim que você tentar enviar algo através dele. Não é possível reconectar um tubo quebrado, principalmente porque não posso me incomodar em fazer algo tão complicado agora. Também é limitado a um cliente por servidor .
Código fonte
Estes são escritos em c #. Não faz muito sentido tentar explicar isso. Eles usam o .NET NamedPipeServerStream e NamedPipeClientStream .
O servidor:
O cliente:
Redirecionando para um arquivo
stderr
saída para esse arquivoIsso fornece o efeito desejado de uma janela do console para assistir
stdout
(e fornecerstdin
) e outra para assistirstderr
.Qualquer coisa que imite
tail
funcionaria. O método PowerShell funciona nativamente no Windows, mas pode ser um pouco lento (ou seja, há alguma latência entre a gravação no arquivo e a exibição na tela). Veja esta questão StackOverflow para outrastail
alternativas.O único problema é que o arquivo temporário pode crescer bastante. Uma solução possível é executar um loop que é impresso apenas se o arquivo tiver conteúdo e limpá-lo imediatamente depois, mas isso causaria uma condição de corrida.
fonte
Estou surpreso que isso ainda não tenha sido respondido corretamente. De fato, existe um caminho UNC atribuído aos pipes nomeados pelo sistema, acessível em qualquer máquina da rede, que pode ser usado como um arquivo normal:
Supondo que os tubos denominados "StdOutPipe" e "StdErrPipe" existam nesta máquina, isso tenta se conectar e gravar neles. A
pipe
parte é o que especifica que você deseja um pipe nomeado.fonte
Não com o shell padrão (CMD.EXE). Para programadores, é bastante fácil . Basta pegar os dois tubos de um processo que você iniciou.
fonte
Suas preferências para um canal de dados do Windows de um servidor para uma janela do cliente imediatamente ou mais tarde podem ser satisfeitas com uma pequena unidade de RAM. A mesma memória é alocada para os dados, gravados / lidos com um nome semelhante ao sistema de arquivos. O cliente exclui o arquivo usado e aguarda outro ou o deixa desaparecer quando o computador é desligado.
fonte