Come fa il prompt dei comandi a sapere quando attendere l'uscita?


90

Stavo tentando di ricodificare il prompt dei comandi di Windows in C #. Mi chiedevo come il prompt dei comandi sappia quando aspettare che il processo abbia iniziato a uscire e quando non aspettare che il processo chiamato esca.

Ad esempio, se digiti nel prompt dei comandi " Blocco note", Blocco note verrà avviato, ma potrai comunque eseguire altri comandi. Tuttavia, se apri un'utilità come more.com, ping.exe o un'altra utilità, attenderà il completamento del programma in esecuzione prima di consentirti di eseguire un altro comando.

Come fa il prompt dei comandi a sapere quando attendere l'uscita e come può essere emulato questo comportamento in C #?


13
Ottima prima domanda!
Rotem

2
Al livello di base, i programmi basati sulla GUI vengono chiamati e l'esecuzione torna al prompt. Potrebbe essere perché la shell non si aspetta che il comando interagisca con esso?
shahkalpesh

Risposte:


122

Se l'applicazione è un'applicazione GUI Win32, verrà eseguita e il prompt dei comandi non attenderà la sua chiusura.

Se l'applicazione è un'applicazione console, verrà eseguita nel prompt dei comandi e sarà necessario attendere che finisca per riavere il prompt dei comandi.

MODIFICARE:

OK. Sembra che tu abbia bisogno di una spiegazione tecnica. Se vuoi emulare la stessa funzione nella tua applicazione, puoi controllare i IMAGE_OPTIONAL_HEADERfile EXE qui .

All'interno IMAGE_OPTIONAL_HEADERsi trovano:

 WORD                 Subsystem;

If SubSystem == 0x02 significa che è un'applicazione GUI.

If SubSystem == 0x03 significa che è un'app del prompt dei comandi.

MODIFICA 2:

Se vuoi vederlo in azione:

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

  2. Copia calc.exe o notepad.exe sul desktop

  3. Apri calc.exe copiato in CFF Explorer

  4. Vai a Intestazioni NT -> Intestazioni facoltative

  5. Cambia sottosistema da 0x002 a 0x003

  6. Salvarla

Ora esegui il nuovo calc modificato e vedrai il prompt dei comandi attendere che venga terminato.


2
@SudhakarTillapudi, sei il benvenuto, ho aggiornato la risposta con maggiori dettagli, spero che spieghi di più.
72DFBF5B A0DF5BE9

3
è davvero istruttivo ancora una volta grazie per avermi ricordato :)
Sudhakar Tillapudi

8

L'impostazione predefinita da un prompt dei comandi è di generare il programma GUI in un processo / fork separato. Tuttavia, è possibile eseguire il blocco note (o un altro programma GUI) in linea con il prompt dei comandi / script della shell:

start /w notepad.exe

In questo modo, il prompt dei comandi / script della shell continua solo dopo che il processo notepad.exe è terminato.

Spero che questo aiuti, TW


3

Quando si avvia un nuovo processo, un'applicazione GUI in questo contesto che funziona effettivamente al di fuori dei confini del prompt, il prompt non attenderà. Tuttavia, se esegui un comando che funziona interamente entro i limiti dell'istanza corrente di un prompt, attende.

Quindi, il comando notepadavvia semplicemente l'applicazione Blocco note e lascia il controllo dell'applicazione. Mentre, il comando ipconfigviene eseguito in un dominio (no, questo non è il dominio dell'applicazione ), del prompt.

Per generalizzare estremamente, quando usi Process.Startl'equivalente in C #, non aspettare. Comunque non lo farà.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.