Skąd wiersz polecenia wie, kiedy czekać na wyjście?

90

Próbowałem wykonać ponowne kodowanie wiersza polecenia systemu Windows w języku C #. Zastanawiałem się, skąd wiersz poleceń wie, kiedy czekać na rozpoczęcie procesu kończenia, a kiedy nie czekać na zakończenie wywoływanego procesu.

Na przykład, jeśli wpiszesz w wierszu polecenia „notatnik”, uruchomi się Notatnik , ale nadal możesz wykonywać inne polecenia. Jeśli jednak otworzysz narzędzie, takie jak more.com, ping.exe lub inne narzędzie, zaczeka na zakończenie działania programu, zanim pozwoli ci wykonać kolejne polecenie.

Skąd wiersz polecenia wie, kiedy czekać na zakończenie i jak można emulować to zachowanie w języku C #?

Justin Krejcha
źródło
13
Świetne pierwsze pytanie!
Rotem
2
Na bardzo podstawowym poziomie programy oparte na graficznym interfejsie użytkownika są wywoływane, a wykonanie powraca do monitu. Może to być spowodowane tym, że powłoka nie oczekuje, że polecenie wejdzie z nią w interakcję?
shahkalpesh

Odpowiedzi:

122

Jeśli aplikacja jest aplikacją GUI Win32, zostanie po prostu uruchomiona, a wiersz polecenia nie będzie czekał na zamknięcie.

Jeśli aplikacja jest aplikacją konsolową, będzie działać w wierszu poleceń i będziesz musiał poczekać, aż zakończy się, aby odzyskać wiersz polecenia.

EDYTOWAĆ:

OK. Wygląda na to, że potrzebujesz wyjaśnienia technicznego. Jeśli chcesz emulować tę samą funkcję w swojej aplikacji, możesz sprawdzić tutajIMAGE_OPTIONAL_HEADER pliki EXE .

Wewnątrz IMAGE_OPTIONAL_HEADERznajduje się:

 WORD                 Subsystem;

If SubSystem == 0x02 oznacza to, że jest to aplikacja GUI.

If SubSystem == 0x03 oznacza to, że jest to aplikacja wiersza poleceń.

EDYCJA 2:

Jeśli chcesz zobaczyć to w akcji:

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

  2. Skopiuj plik calc.exe lub notepad.exe na pulpit

  3. Otwórz skopiowany plik calc.exe w programie CFF Explorer

  4. Przejdź do Nagłówki NT -> Nagłówki opcjonalne

  5. Zmień podsystem z 0x002 na 0x003

  6. Zapisz to

Teraz uruchom nowy zmodyfikowany kalkulator, a zobaczysz wiersz polecenia czekający na zakończenie.

72DFBF5B A0DF5BE9
źródło
2
@SudhakarTillapudi, nie ma za co, zaktualizowałem odpowiedź o więcej szczegółów, mam nadzieję, że wyjaśni więcej.
72DFBF5B A0DF5BE9
3
to naprawdę pouczające, jeszcze raz dziękuję za pozostanie ze mną :)
Sudhakar Tillapudi
8

Domyślnie w wierszu polecenia jest uruchamianie programu GUI w oddzielnym procesie / rozwidleniu. Możesz jednak uruchomić Notatnik (lub inny program GUI) w linii z wierszem poleceń / skryptem powłoki:

start /w notepad.exe

W ten sposób wiersz polecenia / skrypt powłoki jest kontynuowany tylko po zakończeniu procesu notepad.exe.

Mam nadzieję, że to pomoże, TW

Tw Bert
źródło
3

Po uruchomieniu nowego procesu, aplikacji GUI w tym kontekście, która faktycznie działa poza granicami podpowiedzi, podpowiedź nie będzie czekać. Ale jeśli uruchomisz polecenie, które działa całkowicie w granicach bieżącego wystąpienia monitu, czeka.

Tak więc polecenie notepadpo prostu uruchamia aplikację Notatnik i pozostawia kontrolę nad aplikacją. Podczas gdy polecenie ipconfigdziała w domenie (nie, to nie jest domena aplikacji ), z monitu.

Aby bardzo uogólnić, kiedy używasz Process.Startw swoim odpowiedniku C #, nie czekaj. I tak nie będzie.

duński
źródło