¿Qué hace exactamente si hago clic en la ventana de cmd?

45

Supongamos que ejecuto cmd.exe y hago ping a localhost. Después de eso hago ping localhost nuevamente pero hago clic en la ventana y el ping se detiene hasta que presiono enter .

¿Qué sucede exactamente cuando hago clic en la ventana? ¿Suspende el proceso o algo más? Adjunto una captura de pantalla para aclarar este problema.

Nota: en realidad no hago clic, pero arrastro con el mouse, lo que crea un cuadro blanco en la ventana, como puede ver en la captura de pantalla.

Editar: más aclaraciones: lo que realmente deseo saber es si arrastrar la ventana detiene el proceso cmd o no.

Editar: aún más aclaraciones: sé que estoy usando Edición rápida y presionando Intro copia el contenido que seleccioné. Lo que no sé es lo que sucede en el fondo.

ingrese la descripción de la imagen aquí

Adam Arold
fuente
2
Por cierto, puede votar en UserVoice para cambiar este comportamiento: wpdev.uservoice.com/forums/…
Carl Walsh
Agradable. Yo lo voté.
Adam Arold
Votar me está llevando a una página 404
Kelly Bang
1
Y lo que es más importante, aquí se explica cómo desactivar esta característica horrible stackoverflow.com/a/37578608/463967
Alan Macdonald

Respuestas:

27

Cuando selecciona algún texto en la ventana cmd.exe, el proceso continuará en segundo plano hasta la próxima vez que escriba en Salida estándar (o STDOUT, el flujo de datos que se muestra en la ventana cmd.exe).

Cuando salga del modo de selección, el proceso se reanudará normalmente.

Puede probar esto escribiendo ping www.google.com -ten su ventana cmd.exe y seleccionando alguna área de la salida. Verá que se detiene, y cuando anule la selección, la salida se reanudará.

Editar: según el comentario de Fran, puede usar una herramienta como Wireshark para ver que la actividad todavía ocurre después del punto en que realizó la selección, y luego se detiene.

JohnL
fuente
3
Eso solo no lo prueba. También debe ejecutar Wireshark y ver si los paquetes ICMP dejan de enviarse. Si es así, tiene razón en que el proceso se suspende. De lo contrario, el proceso no se suspende y la salida simplemente se almacena en el búfer (hasta que se llenen los búferes, entonces se suspenderá o se perderán los datos).
Fran
1
Estoy bastante seguro de que @Fran tiene razón: ¿no aparece una gran cantidad de resultados a la vez, si esperaste lo suficiente en el modo de selección?
Izkata
1
Esto me molestó mucho, pero descubrí que si va a las propiedades de las ventanas de cmd puede anular la selección de "Modo de edición rápida" y no ingresará al modo de selección haciendo clic en la ventana.
Zitrax
2
@Zitrax sí, así es como puedes evitar que esto suceda accidentalmente. Frecuentemente copio cosas de mi ventana de comandos, así que no hago eso. (bueno, en realidad uso Consolez que no tiene ese problema)
JohnL
1
Esto se llama " bloqueo " ... es decir: la aplicación llama write()pero se atasca.
Attie
50

Una vez que haga clic en la ventana del símbolo del sistema, el host de la consola ya no permitirá que se escriba la salida. La aplicación en sí sigue ejecutándose, pero no se escribe nada en la pantalla.

Por supuesto, siempre que haya un solo hilo, esto es básicamente lo mismo que congelar su proceso. A medida que el hilo único intenta escribir algo de salida antes de hacer más trabajo.

Si ejecuto ping -t localhosty hago clic en la ventana del símbolo del sistema, puedo inspeccionar la pila de llamadas del ping.exehilo principal con Process Explorer .

ingrese la descripción de la imagen aquí

Podemos ver que ping.exetrató de escribir alguna salida. Llamó write()a la biblioteca de tiempo de ejecución C. Esa función, en algún momento, llama a GetConsoleMode . Como parece, esa función verificará si el usuario está actualmente en modo de marca y bloqueará la ejecución si es necesario.

Análisis mas extenso

Podemos probar aún más este comportamiento examinando el comportamiento de pingcon Wireshark

Cuando se ejecuta ping -t superuser.com, vemos el siguiente resultado en Wireshark:
ingrese la descripción de la imagen aquí

Ahora, marquemos un cuadro en el símbolo del sistema.
ingrese la descripción de la imagen aquí
De repente, no se registran más pings en Wireshark. pingya no está enviando ningún paquete.

Pero eso ya lo sabiamos...

Bien, ¡veamos si la salida es realmente el problema aquí! Dirigamos la salida al NULdispositivo:

ingrese la descripción de la imagen aquí

Ahora, ya no hay ninguna salida. Ahora podemos marcar el texto en el cuadro durante todo el día, los paquetes se registrarán en Wireshark.

ingrese la descripción de la imagen aquí

Der Hochstapler
fuente
Si no hubiera hecho +1 para la respuesta original, ahora haría +1 para el "Análisis adicional"
JohnL
6

Esto se debe a que la ventana ha entrado en el modo Marca. Cuando presiona Intro, copia el texto seleccionado en el portapapeles. Que yo sepa, no hay una configuración para esto, por lo que no estoy seguro de por qué lo hace cuando hace clic en la ventana. Normalmente tienes que hacer clic derecho y presionar "Marcar". Verifique para asegurarse de que no haya teclas atascadas en su teclado.

Brandon J. Dusseau
fuente
¿Y qué hace el "modo Mark"? ¿Suspende el proceso?
Adam Arold el
El modo de marca se utiliza para copiar texto desde la ventana de comandos. AFAIK es el único uso, aunque supongo que puede haber otros.
Garrett
77
La configuración se llama Modo de edición rápida. Haga clic en el icono en la esquina superior izquierda, elija Propiedades y Elija el Modo de edición rápida en la pestaña Opciones. Por lo que sé, el proceso continuará en segundo plano hasta que necesite interactuar con la consola, momento en el que se bloqueará
JohnL
@JohnL por favor crea una respuesta porque tu comentario es lo que estoy buscando.
Adam Arold el
@edem Agregó una respuesta :)
JohnL
6

Su ventana CMD está en modo de edición rápida que ingresa automáticamente al modo de edición cuando hace clic en la pantalla. La entrada es para copiar el texto en el cuadro blanco y salir del modo de edición.

Normalmente, CMD solo ingresa al modo de edición cuando hace clic derecho en la pantalla negra y selecciona Marcar.

Para volver a la normalidad, haga clic derecho en la barra de título de las ventanas y elija Propiedades, seleccione la pestaña Opciones y deseleccione "Modo de edición rápida" y haga clic en Aceptar.

Nam Phung
fuente
3

Cuando selecciona el texto para copiar desde la ventana (cuando está en Markmodo), el sistema suspende el proceso actual en esa ventana.

Ejemplo de archivo por lotes:

:test
echo %0
goto test

cuando se ejecuta esto, tan pronto como marco el área para copiar, la pantalla deja de desplazarse

SeanC
fuente
Estaba a punto de publicar exactamente lo mismo (excepto que mi archivo por lotes era echo blah↵%0). :-)
Synetech
1

Como todos han señalado tan amablemente, el progreso de la salida adicional se bloquea mientras una operación de marca está en progreso. Además, ya sea usando el clic alternativo del mouse (clic derecho por defecto) o presionando la tecla Enter en su teclado, puede salir del modo Marcar y copiar la selección marcada en el búfer de pegado de Windows. Hay otra salida y es presionar la tecla Esc para abandonar el marcado de un área de pantalla y liberar el bloque en la salida. Esto supone que tiene seleccionado el modo QuickEdit en las propiedades de esa ventana de comandos. También puede entrar en esta situación más deliberadamente diciéndole a la ventana de comandos que desea seleccionar algún texto.

Día D
fuente
0

Para corroborar aún más la afirmación de que el proceso se detiene en el "modo Marca", por ejemplo, al hacer clic con el mouse o arrastrar dentro de los bordes de la ventana cmd.exe, pero detiene cualquier operación solo después de terminar completamente con la instancia en progreso, ofrezco una prueba indirecta:

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

Está viendo la secuencia de registro de una instalación de Visual Studio donde la utilidad de línea de comandos de instalación de Visual Studio está verificando todas las cargas de trabajo instaladas.

A las 13:26:26 hice clic en el interior de la ventana del símbolo del sistema. La salida a la pantalla se detiene hasta las 14:09:03 cuando presiono Enter para salir del "modo Mark".

Ahora observe que después de las 13:26:26, el proceso termina de verificar el hash x86-23_r20.zip, el mensaje " tuvo éxito. Hash: X " y reinicie con otro archivo a las 14:09:03, el mensaje " COMIENZO: Verificando" [..] AndroidSDKPrivateInstall.ps1 "

Durante la pausa, Visual Studio Setup Command Line Utility concluyó la verificación del archivo que se estaba procesando y, exactamente en el momento en que el control debía devolverse a la consola, comenzó un nuevo trabajo de comprobación de hash.

pin8all
fuente