O que ele faz exatamente se eu clicar na janela do cmd?

45

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.

insira a descrição da imagem aqui

Adam Arold
fonte
2
BTW, você pode votar no UserVoice para alterar esse comportamento: wpdev.uservoice.com/forums/…
Carl Walsh
Agradável. Eu votei nele.
Adam Arold
A votação está me levando para uma página 404 #
Kelly Bang
1
E mais importante, aqui está como desativar esse recurso horrível: stackoverflow.com/a/37578608/463967
Alan Macdonald

Respostas:

27

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 -tna 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.

JohnL
fonte
3
Só isso não prova. Você também precisa executar o Wireshark e verificar se os pacotes ICMP param de ser enviados. Nesse caso, você está certo de que o processo está suspenso. Caso contrário, o processo não será suspenso e a saída simplesmente será armazenada em buffer (até que os buffers sejam preenchidos, será suspenso ou os dados serão perdidos).
Fran
1
Tenho certeza de que @Fran está certo - um monte de saída não aparece de uma só vez, se você esperou o tempo suficiente no modo de seleção?
Izkata 9/08/12
1
Isso me incomodou muito, mas descobri que, se você for às propriedades das janelas do cmd, poderá desmarcar "Modo de edição rápida" e não entrará no modo de seleção clicando na janela.
Zitrax 30/01
2
@ Zitrax sim, é assim que você pode impedir que isso aconteça acidentalmente. Eu frequentemente copio as coisas da minha janela de comando, então não faço isso. (bem, na verdade eu uso Consolez que não tem esse problema)
johnl
1
Isso é chamado de " bloqueio " ... ou seja: o aplicativo chama, write()mas fica preso.
Attie
50

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 localhoste clicar na janela do prompt de comando, poderá inspecionar a pilha de chamadas do ping.exethread principal com o Process Explorer .

insira a descrição da imagem aqui

Podemos ver que ping.exetentei escrever alguma saída. Ele chamou write()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 pingcom Wireshark

Ao executar ping -t superuser.com, vemos a seguinte saída no Wireshark:
insira a descrição da imagem aqui

Agora, vamos marcar uma caixa no prompt de comando.
insira a descrição da imagem aqui
De repente, não há mais pings registrados no Wireshark. pingnã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 NULdispositivo:

insira a descrição da imagem aqui

Agora, não há mais saída. Agora podemos marcar o texto na caixa o dia inteiro, os pacotes serão registrados no Wireshark.

insira a descrição da imagem aqui

Der Hochstapler
fonte
Se eu não tivesse marcado com +1 já para a resposta original, eu tinha um agora para o "Uma análise mais aprofundada"
johnl
6

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.

Brandon J. Dusseau
fonte
E o que o "modo Mark" faz? Suspende o processo?
Adam Arold 9/08/12
O modo de marcação é usado para copiar texto da janela de comando. AFAIK que é o único uso, embora suponha que possa haver outros.
Garrett
7
A configuração é chamada Modo de Edição Rápida. Clique no ícone no canto superior esquerdo, escolha Propriedades e Escolha o modo de edição rápida na guia Opções. Pelo que eu sei, o processo continuará em segundo plano até que ele precisa para interagir com o console, em que ponto ele irá bloquear
johnl
@JohnL, por favor, crie uma resposta porque seu comentário é o que eu estou procurando.
Adam Arold
@edem Adicionada uma resposta :)
JohnL
6

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.

Nam Phung
fonte
3

Quando você seleciona o texto para copiar da janela (quando está no Markmodo), o sistema suspende o processo atual nessa janela.

Arquivo em lote de exemplo:

:test
echo %0
goto test

quando isso é executado, assim que eu marcar a área a ser copiada, a tela para de rolar

SeanC
fonte
Eu estava prestes a postar exatamente a mesma coisa (exceto que meu arquivo em lotes era echo blah↵%0). :-)
Synetech
1

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.

Dia D
fonte
0

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:

[1378:000f][2018-10-08T13:26:20] END: Verifying package "AndroidEmulator,version=26.0.0.2"
[1378:000f][2018-10-08T13:26:20] BEGIN: Verifying package "AndroidImage_ARM_API23,version=20.0.0.3"
[1378:000f][2018-10-08T13:26:20] Verifying package 'AndroidImage_ARM_API23,version=20.0.0.3'
[1378:000c][2018-10-08T13:26:26] SHA256 verification for 'AndroidImage_x86_API23,version=20.0.0.3\x86-23_r20.zip' succeeded. Hash: X
[1378:0025][2018-10-08T14:09:03] BEGIN: Verifying "AndroidImage_ARM_API23,version=20.0.0.3\AndroidSDKPrivateInstall.ps1"
[1378:0012][2018-10-08T14:09:03] BEGIN: Verifying "AndroidImage_ARM_API23,version=20.0.0.3\armeabi-v7a-23_r20.zip"
[1378:0012][2018-10-08T14:09:03] Authenticode verification returned 0x800b0003 for path: AndroidImage_ARM_API23,version=20.0.0.3\armeabi-v7a-23_r20.zip.
[1378:0012][2018-10-08T14:09:03] Retrying validation for: AndroidImage_ARM_API23,version=20.0.0.3\armeabi-v7a-23_r20.zip
[1378:000c][2018-10-08T14:09:03] Authenticode verification returned 0x800b0003 for path: AndroidImage_x86_API23,version=20.0.0.3\x86-23_r20.zip.

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.

pin8all
fonte