Bagaimana prompt perintah tahu kapan harus menunggu keluar?

90

Saya mencoba untuk melakukan kode ulang prompt perintah Windows di C #. Saya bertanya-tanya bagaimana prompt perintah tahu kapan harus menunggu proses mulai keluar, dan kapan tidak menunggu proses yang dipanggil untuk keluar.

Misalnya, jika Anda mengetik di command prompt "notepad", Notepad akan diluncurkan, tetapi Anda masih dapat menjalankan perintah lain. Namun, jika Anda membuka utilitas seperti more.com, ping.exe, atau utilitas lain, program tersebut akan menunggu hingga program yang dijalankan selesai sebelum mengizinkan Anda menjalankan perintah lain.

Bagaimana prompt perintah mengetahui kapan harus menunggu keluar, dan bagaimana perilaku ini dapat ditiru di C #?

Justin Krejcha
sumber
13
Pertanyaan pertama yang bagus!
Rotem
2
Pada tingkat yang paling dasar, program berbasis GUI dipanggil & eksekusi kembali ke prompt. Mungkinkah karena shell tidak mengharapkan perintah untuk berinteraksi dengannya?
shahkalpesh

Jawaban:

122

Jika aplikasinya adalah aplikasi GUI Win32, itu hanya akan berjalan dan command prompt tidak akan menunggu untuk keluar.

Jika aplikasinya adalah aplikasi konsol, itu akan berjalan di command prompt dan Anda harus menunggu hingga selesai untuk mendapatkan kembali prompt perintah.

EDIT:

BAIK. Sepertinya Anda membutuhkan penjelasan teknis. Jika Anda ingin meniru fitur yang sama dalam aplikasi Anda, Anda dapat memeriksa IMAGE_OPTIONAL_HEADERfile EXE di sini .

Di dalamnya IMAGE_OPTIONAL_HEADER, ada:

 WORD                 Subsystem;

If SubSystem == 0x02 artinya ini adalah aplikasi GUI.

If SubSystem == 0x03 itu berarti itu adalah aplikasi prompt perintah.

EDIT 2:

Jika Anda ingin melihatnya beraksi:

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

  2. Salin calc.exe atau notepad.exe ke desktop Anda

  3. Buka calc.exe yang disalin di CFF Explorer

  4. Arahkan ke Nt Headers -> Opsional Headers

  5. Ubah SubSistem dari 0x002 menjadi 0x003

  6. Simpan itu

Sekarang jalankan calc yang baru dimodifikasi dan Anda akan melihat command prompt menunggu sampai itu dihentikan.

72DFBF5B A0DF5BE9
sumber
2
@SudhakarTillapudi, sama-sama, saya perbarui jawaban dengan detail lebih lanjut, semoga menjelaskan lebih lanjut.
72DFBF5B A0DF5BE9
3
ini benar-benar informatif sekali lagi terima kasih untuk tetap menggali saya :)
Sudhakar Tillapudi
8

Default dari prompt perintah adalah untuk menelurkan program GUI dalam proses / garpu terpisah. Namun, Anda dapat menjalankan notepad (atau program GUI lainnya) sesuai dengan command prompt / skrip shell:

start /w notepad.exe

Dengan cara ini, skrip command prompt / shell hanya berlanjut setelah proses notepad.exe telah dihentikan.

Semoga ini bisa membantu, TW

Tw Bert
sumber
3

Saat Anda memulai proses baru, aplikasi GUI dalam konteks ini yang benar-benar bekerja di luar batas prompt, prompt tidak akan menunggu. Tapi, jika Anda menjalankan perintah yang bekerja sepenuhnya di bawah batas contoh saat ini dari prompt, itu menunggu.

Jadi, perintah notepadbaru saja memulai aplikasi Notepad dan meninggalkan kontrol aplikasi. Sementara, perintah ipconfigberjalan di bawah domain (tidak, ini bukan domain aplikasi ), dari prompt.

Untuk sangat menggeneralisasi, saat Anda menggunakan Process.Startpadanan C # Anda, jangan menunggu. Bagaimanapun juga tidak akan.

Orang Denmark
sumber