Suponha que eu execute o cmd.exe e execute ping localhost. Depois disso, sigo localhost novamente, mas clico na janela e o ping pára até pressionar enter .
O que acontece exatamente quando clico na janela? Suspende o processo ou algo mais? Anexei uma captura de tela para esclarecer esse problema.
Nota: Na verdade, não clico, mas arrasto usando o mouse, o que cria uma caixa branca na janela, como você pode ver na captura de tela.
Edit: mais esclarecimentos: O que eu realmente quero saber é se arrastar a janela interrompe o processo de cmd ou não?
Editar: ainda mais esclarecimentos: sei que estou usando a Edição rápida e pressionando enter copia o conteúdo que selecionei. O que eu não sei é o que acontece em segundo plano.
windows-7
command-line
Adam Arold
fonte
fonte
Respostas:
Quando você seleciona algum texto na janela do cmd.exe, o processo continua em segundo plano até a próxima vez que gravar na Saída padrão (ou STDOUT, o fluxo de dados que é mostrado na janela do cmd.exe).
Quando você sair do modo de seleção, o processo será retomado normalmente.
Você pode testar isso digitando
ping www.google.com -t
na janela do cmd.exe e selecionando alguma área da saída. Você verá uma pausa e, quando desmarcar, a saída será retomada.Editar: de acordo com o comentário de Fran, você pode usar uma ferramenta como o Wireshark para ver se a atividade ainda acontece após o momento em que você fez a seleção e depois para.
fonte
write()
mas fica preso.Depois de clicar na janela do prompt de comando, o host do console não permitirá mais que a saída seja gravada. O aplicativo em si continua em execução, mas nada é gravado na tela.
Obviamente, desde que haja apenas um único encadeamento, isso é basicamente a mesma coisa que congelar o processo. Como o thread único tenta gravar alguma saída antes de fazer mais trabalho.
Se eu executar
ping -t localhost
e clicar na janela do prompt de comando, poderá inspecionar a pilha de chamadas doping.exe
thread principal com o Process Explorer .Podemos ver que
ping.exe
tentei escrever alguma saída. Ele chamouwrite()
na biblioteca de tempo de execução C. Essa função, em algum momento, chama GetConsoleMode . Como parece, essa função irá verificar se o usuário está atualmente no modo de marcação e bloquear a execução, se necessário.Análise Adicional
Podemos mais uma prova este comportamento, examinando o comportamento de
ping
com WiresharkAo executar
ping -t superuser.com
, vemos a seguinte saída no Wireshark:Agora, vamos marcar uma caixa no prompt de comando.
De repente, não há mais pings registrados no Wireshark.
ping
não está mais enviando nenhum pacote.Mas nós já sabiamos disso...
Certo, vamos ver se a saída é realmente o problema aqui! Vamos direcionar a saída para o
NUL
dispositivo:Agora, não há mais saída. Agora podemos marcar o texto na caixa o dia inteiro, os pacotes serão registrados no Wireshark.
fonte
Isso ocorre porque a janela entrou no modo Marcar. Quando você pressiona enter, ele copia o texto selecionado para a área de transferência. Que eu saiba, não existe uma configuração para isso, então não sei por que isso acontece quando você clica na janela. Normalmente você tem que clicar com o botão direito e clicar em "Mark". Verifique se não há teclas presas no teclado.
fonte
As janelas do CMD estão no modo de edição rápida, que entra automaticamente no modo de edição quando você clica na tela. O Enter é para copiar o texto na caixa branca e sair do modo de edição.
Normalmente, o CMD só entra no modo de edição quando você clica com o botão direito na tela preta e escolhe Marcar.
Para voltar ao normal, clique com o botão direito do mouse na barra de título das janelas e escolha Propriedades, selecione a guia Opções e desmarque "Modo de edição rápida" e clique em ok.
fonte
Quando você seleciona o texto para copiar da janela (quando está no
Mark
modo), o sistema suspende o processo atual nessa janela.Arquivo em lote de exemplo:
quando isso é executado, assim que eu marcar a área a ser copiada, a tela para de rolar
fonte
echo blah↵%0
).:-)
Como todos enfatizaram tão bem, o progresso da produção adicional é bloqueado enquanto uma operação de marcação está em andamento. Além disso, usando o clique alternativo do mouse (clique com o botão direito do mouse por padrão) ou pressionando a tecla Enter no teclado, você pode sair do modo Marcar e copiar a seleção marcada no buffer de colagem do Windows. Há outra saída: pressionar a tecla Esc para abandonar a marcação de uma área da tela e liberar o bloco na saída. Isso pressupõe que você tenha o modo QuickEdit selecionado nas propriedades da janela de comando. Você também pode entrar nessa situação mais deliberadamente dizendo à janela de comando que deseja selecionar algum texto.
fonte
Para corroborar ainda mais a afirmação de que o processo foi pausado no "modo Mark", por exemplo, durante um clique do mouse ou arraste dentro das bordas da janela do cmd.exe, mas interrompe qualquer operação somente após o término completo da instância em andamento, ofereço uma prova indireta:
Você está observando o fluxo de log de uma instalação do Visual Studio em que o Utilitário de Linha de Comando da Instalação do Visual Studio está verificando todas as cargas de trabalho instaladas.
Às 13:26:26, cliquei dentro da janela do prompt de comando. A saída para a tela pára até 14:09:03, quando pressionarei Enter para sair do "modo Mark".
Agora observe que, depois de 13:26:26, o processo termina para verificar o hash x86-23_r20.zip, a mensagem " bem-sucedida. Hash: X " e reinicie com outro arquivo às 14:09:03, a mensagem " BEGIN: Verifying" [..] AndroidSDKPrivateInstall.ps1 "
Durante a pausa, o Utilitário de linha de comando de instalação do Visual Studio concluiu a verificação do arquivo que estava sendo processado e, exatamente no momento em que o controle deveria ser retornado ao console, iniciou um novo trabalho de verificação de hash.
fonte