Woher weiß die Eingabeaufforderung, wann auf das Beenden gewartet werden muss?

90

Ich habe versucht, eine Windows-Eingabeaufforderung in C # neu zu codieren. Ich habe mich gefragt, woher die Eingabeaufforderung weiß, wann auf das Beenden des Prozesses gewartet werden muss und wann nicht auf das Beenden des aufgerufenen Prozesses gewartet werden muss.

Wenn Sie beispielsweise die Eingabeaufforderung "notepad" eingeben , wird Notepad gestartet, Sie können jedoch weiterhin andere Befehle ausführen. Wenn Sie jedoch ein Dienstprogramm wie more.com, ping.exe oder ein anderes Dienstprogramm öffnen, wartet es, bis das ausführende Programm beendet ist, bevor Sie einen anderen Befehl ausführen können.

Woher weiß die Eingabeaufforderung, wann auf das Beenden gewartet werden muss, und wie kann dieses Verhalten in C # emuliert werden?

Justin Krejcha
quelle
13
Tolle erste Frage!
Rotem
2
Im Grunde werden die GUI-basierten Programme aufgerufen und die Ausführung kehrt zur Eingabeaufforderung zurück. Es könnte sein, dass die Shell nicht erwartet, dass der Befehl mit ihm interagiert?
Shahkalpesh

Antworten:

122

Wenn es sich bei der Anwendung um eine Win32-GUI-Anwendung handelt, wird sie nur ausgeführt und die Eingabeaufforderung wartet nicht auf das Beenden.

Wenn es sich bei der Anwendung um eine Konsolenanwendung handelt, wird sie an der Eingabeaufforderung ausgeführt, und Sie müssen warten, bis sie abgeschlossen ist, um die Eingabeaufforderung wieder zu erhalten.

BEARBEITEN:

OK. Es scheint, dass Sie eine technische Erklärung benötigen. Wenn Sie dieselbe Funktion in Ihrer Anwendung emulieren möchten, können Sie hier dieIMAGE_OPTIONAL_HEADER EXE-Dateien überprüfen .

Im Inneren IMAGE_OPTIONAL_HEADERgibt es:

 WORD                 Subsystem;

If SubSystem == 0x02 Es bedeutet, dass es sich um eine GUI-Anwendung handelt.

If SubSystem == 0x03 Es bedeutet, dass es sich um eine Eingabeaufforderungs-App handelt.

EDIT 2:

Wenn Sie es in Aktion sehen möchten:

  1. Laden Sie http://www.ntcore.com/exsuite.php herunter

  2. Kopieren Sie calc.exe oder notepad.exe auf Ihren Desktop

  3. Öffnen Sie die kopierte calc.exe im CFF Explorer

  4. Navigieren Sie zu Nt-Header -> Optionale Header

  5. Ändern Sie das Subsystem von 0x002 in 0x003

  6. Speichern Sie es

Führen Sie nun die neue geänderte Berechnung aus, und die Eingabeaufforderung wartet darauf, dass sie beendet wird.

72DFBF5B A0DF5BE9
quelle
2
@ SudhakarTillapudi, du bist willkommen, ich habe die Antwort mit mehr Details aktualisiert, hoffe es wird mehr erklären.
72DFBF5B A0DF5BE9
3
Es ist wirklich wieder informativ. Danke, dass du mich zurückgelassen hast :)
Sudhakar Tillapudi
8

Standardmäßig wird an einer Eingabeaufforderung das GUI-Programm in einem separaten Prozess / Fork erzeugt. Sie können den Editor (oder ein anderes GUI-Programm) jedoch inline mit Ihrer Eingabeaufforderung / Ihrem Shell-Skript ausführen:

start /w notepad.exe

Auf diese Weise wird die Eingabeaufforderung / das Shell-Skript erst fortgesetzt, nachdem der Prozess notepad.exe beendet wurde.

Hoffe das hilft, TW

Tw Bert
quelle
3

Wenn Sie einen neuen Prozess starten, eine GUI-Anwendung in diesem Kontext, die tatsächlich außerhalb der Grenzen der Eingabeaufforderung funktioniert, wartet die Eingabeaufforderung nicht. Wenn Sie jedoch einen Befehl ausführen, der vollständig unter den Grenzen der aktuellen Instanz einer Eingabeaufforderung funktioniert, wartet er.

Der Befehl notepadstartet also nur die Notepad-Anwendung und überlässt die Kontrolle über die Anwendung. Währenddessen wird der Befehl ipconfigunter einer Domäne (nein, dies ist keine Anwendungsdomäne ) der Eingabeaufforderung ausgeführt.

Um es extrem zu verallgemeinern, Process.Startwarten Sie nicht , wenn Sie es in Ihrem C # -Äquivalent verwenden. Das wird es sowieso nicht.

dänisch
quelle