tecla pause lenovo laptop windows cmd signals

windows - pause - tecla break en laptop lenovo



¿Cómo y por qué el modo QuickEdit en el símbolo del sistema congela las aplicaciones? (2)

Recientemente tuve un problema con el símbolo del sistema en Windows, donde el modo QuickEdit estaba habilitado y al hacer clic en la ventana estaba seleccionando texto y colgando un programa en ejecución. Este es, aparentemente, un comportamiento conocido: encontré algunas preguntas relacionadas con él:

  • Línea de comando Windows colgando en Windows RDP
  • Aplicación de consola de Windows atascada
  • Cómo deshabilitar el modo QuickEdit para scripts individuales

¿Cómo se "detiene" / "suspende" la aplicación? ¿Es el proceso similar a la señal SIGSTOP en * nix? (También estoy interesado en entender por qué esta funcionalidad existe en primer lugar. Parece poco intuitiva y peligrosa).


Esto es mucho por diseño. No hay forma razonable de que un usuario pueda seleccionar texto cuando su programa sigue desplazándose por el contenido de la ventana de la consola. Entonces, el programa host de la consola simplemente deja de leer su salida stdout / stderr y su programa se cuelga hasta que el usuario completa la operación. Esto se puede cambiar, tendrá que llamar a Get+SetConsoleMode() y desactivar la opción ENABLE_QUICK_EDIT_MODE.

Tenga en cuenta que este "bloqueo" no es fundamentalmente diferente de las pausas de ejecución que obtiene cuando su programa genera una salida estándar a una velocidad muy superior a la que el host de la consola puede consumir. Aunque esos retrasos son finitos.

Y no es la única forma en que el usuario puede detener su programa, también puede simplemente presionar Ctrl + S. Al presionar Ctrl + Q se reanuda nuevamente. Si tienes la edad suficiente, entonces podrías reconocer estos códigos de control como Xon/Xoff , caracteres de apretón de manos para un terminal. Que es realmente una consola, una simple emulación de un terminal de la forma en que se usaron en la década de 1970. Esto también se puede cambiar, tendrá que dejar de depender de la entrada de consola incorporada y cambiar a ReadConsole() . O al desactivar la opción de consola ENABLE_LINE_INPUT, no estoy tan seguro de los efectos secundarios que tiene, ya que no mencionó ningún tiempo de ejecución de idioma, tendrá que intentarlo.

Y, por supuesto, terminar su programa es muy fácil. Obtiene EOF en stdin cuando el usuario escribe Ctrl + Z, que debería finalizar su programa. Y hay Ctrl + C y Ctrl + Break para una terminación instantánea, independientemente de lo que esté haciendo su programa. Puede obtener una notificación para estos con SetConsoleCtrlHandler() pero no puede bloquearlo.

Si el comportamiento predeterminado es peligroso y pone en riesgo la salud de un ser humano, le sugiero que contrate a un consultor. Y no sabré quién escribió esta respuesta.


Para responder a cómo recientemente estaba depurando el mismo problema en un script de Python y capturé un seguimiento de pila usando windbg.

La llamada a WriteConsole finalmente conduce a la llamada al sistema NtDeviceIoControlFile y el kernel no regresa hasta que se presiona una tecla o se cambia el modo QuickEdit. Entonces, si nunca escribe en la consola, su proceso está a salvo de la congelación del modo QuickEdit. Y su usuario nunca necesitará copiar nada. Entonces, ¿para qué sirve nuevamente el modo QuickEdit?