¿Cómo sabe el símbolo del sistema cuándo esperar para salir?

90

Estaba intentando volver a codificar el símbolo del sistema de Windows en C #. Me preguntaba cómo el símbolo del sistema sabe cuándo esperar a que el proceso comience a salir y cuándo no esperar a que salga el proceso llamado.

Por ejemplo, si escribe en el símbolo del sistema "bloc de notas", el Bloc de notas se iniciará, pero aún puede ejecutar otros comandos. Sin embargo, si abre una utilidad como more.com, ping.exe u otra utilidad, esperará a que finalice el programa en ejecución antes de permitirle ejecutar otro comando.

¿Cómo sabe el símbolo del sistema cuándo esperar la salida y cómo se puede emular este comportamiento en C #?

Justin Krejcha
fuente
13
¡Gran primera pregunta!
Rotem
2
En un nivel muy básico, los programas basados ​​en GUI se llaman y la ejecución vuelve al indicador. ¿Podría ser porque el shell no espera que el comando interactúe con él?
Shahkalpesh

Respuestas:

122

Si la aplicación es una aplicación GUI de Win32, simplemente se ejecutará y el símbolo del sistema no esperará a que se cierre.

Si la aplicación es una aplicación de consola, se ejecutará en el símbolo del sistema y deberá esperar a que termine para recuperar el símbolo del sistema.

EDITAR:

OKAY. Parece que necesita una explicación técnica. Si desea emular la misma función en su aplicación, puede verificar los IMAGE_OPTIONAL_HEADERarchivos EXE aquí .

En el interior IMAGE_OPTIONAL_HEADERhay:

 WORD                 Subsystem;

If SubSystem == 0x02 significa que es una aplicación GUI.

If SubSystem == 0x03 significa que es una aplicación de símbolo del sistema.

EDITAR 2:

Si quieres verlo en acción:

  1. Descarga http://www.ntcore.com/exsuite.php

  2. Copie calc.exe o notepad.exe en su escritorio

  3. Abra calc.exe copiado en CFF Explorer

  4. Navegue a Nt Headers -> Opcional Headers

  5. Cambiar el subsistema de 0x002 a 0x003

  6. Guárdalo

Ahora ejecute el nuevo calc modificado y verá que el símbolo del sistema espera a que termine.

72DFBF5B A0DF5BE9
fuente
2
@SudhakarTillapudi, de nada, actualicé la respuesta con más detalles, espero que explique más.
72DFBF5B A0DF5BE9
3
es realmente informativo una vez más gracias por seguirme :)
Sudhakar Tillapudi
8

El valor predeterminado de un símbolo del sistema es generar el programa GUI en un proceso / bifurcación separado. Sin embargo, puede ejecutar el bloc de notas (u otro programa de GUI) en línea con su símbolo del sistema / script de shell:

start /w notepad.exe

De esta manera, el script de línea de comandos / shell solo continúa después de que el proceso notepad.exe haya finalizado.

Espero que esto ayude, TW

Tw Bert
fuente
3

Cuando inicia un nuevo proceso, una aplicación GUI en este contexto que realmente funciona fuera de los límites del mensaje, el mensaje no esperará. Pero, si ejecuta un comando que funciona completamente dentro de los límites de la instancia actual de un indicador, espera.

Entonces, el comando notepadsimplemente inicia la aplicación Bloc de notas y deja el control de la aplicación. Mientras, el comando se ipconfigejecuta bajo un dominio (no, esto no es un dominio de aplicación ), del indicador.

Para generalizar extremadamente, cuando use Process.Starten su equivalente de C #, no espere. De todos modos no lo hará.

danés
fuente