Komut istemi çıkış için ne zaman bekleyeceğini nasıl bilir?


90

C # ile bir Windows komut istemi yeniden kodu yapmaya çalışıyordum. Komut isteminin, işlemin çıkmaya başlaması için ne zaman bekleyeceğini ve çağrılan işlemin ne zaman çıkmasını beklemeyeceğini nasıl bildiğini merak ediyordum.

Örneğin, "not defteri" komut istemine yazarsanız, Not Defteri başlatılır, ancak yine de diğer komutları çalıştırabilirsiniz. Bununla birlikte, more.com, ping.exe veya başka bir yardımcı program gibi bir yardımcı program açarsanız, başka bir komutu çalıştırmanıza izin vermeden önce çalıştırılan programın bitmesini bekler.

Komut istemi çıkış için ne zaman bekleyeceğini nasıl bilir ve bu davranış C # 'da nasıl taklit edilebilir?


13
İlk soru harika!
Rotem

2
En temel düzeyde, GUI tabanlı programlar çağrılır ve yürütme komut istemine geri döner. Bunun nedeni, kabuğun komutun kendisiyle etkileşime girmesini beklememesi olabilir mi?
shahkalpesh

Yanıtlar:


122

Uygulama bir Win32 GUI uygulamasıysa, yalnızca çalışır ve komut istemi uygulamanın çıkmasını beklemez.

Uygulama bir konsol uygulamasıysa, komut isteminde çalışır ve komut istemini geri almak için bitmesini beklemeniz gerekir.

DÜZENLE:

TAMAM. Teknik açıklamaya ihtiyacınız var gibi görünüyor. Uygulamanızda aynı özelliği taklit etmek istiyorsanız IMAGE_OPTIONAL_HEADER, EXE dosyalarını buradan kontrol edebilirsiniz .

İçeride IMAGE_OPTIONAL_HEADER:

 WORD                 Subsystem;

If SubSystem == 0x02 bu bir GUI uygulaması olduğu anlamına gelir.

If SubSystem == 0x03 bu bir komut istemi uygulaması olduğu anlamına gelir.

DÜZENLEME 2:

Eylem halinde görmek istiyorsanız:

  1. Http://www.ntcore.com/exsuite.php dosyasını indirin

  2. Calc.exe veya notepad.exe'yi masaüstünüze kopyalayın

  3. Kopyalanan calc.exe'yi CFF Gezgini'nde açın

  4. Nt Başlıkları -> İsteğe Bağlı Başlıklar'a gidin

  5. SubSystem'i 0x002'den 0x003'e değiştirin

  6. Kaydet

Şimdi yeni değiştirilmiş calc'ı çalıştırın ve komut isteminin sonlandırılmasını beklediğini göreceksiniz.


2
@SudhakarTillapudi, rica ederim, cevabı daha fazla ayrıntıyla güncelledim, umarım daha fazlasını açıklar.
72DFBF5B A0DF5BE9

3
bu gerçekten bilgilendirici bir kez daha bana kalan için teşekkür ederim :)
Sudhakar Tillapudi

8

Bir komut isteminin varsayılanı, GUI programını ayrı bir işlemde / çatalda oluşturmaktır. Ancak, komut isteminiz / kabuk betiğinizle satır içi not defteri (veya başka bir GUI programı) çalıştırabilirsiniz:

start /w notepad.exe

Bu şekilde, komut istemi / kabuk betiği yalnızca notepad.exe işlemi sonlandırıldıktan sonra devam eder.

Umarım bu yardımcı olur, TW


3

Yeni bir işlem başlattığınızda, bu bağlamda aslında komutun sınırları dışında çalışan bir GUI uygulaması, komut istemi beklemez. Ancak, tamamen geçerli bir bilgi istemi örneğinin sınırları altında çalışan bir komut çalıştırırsanız, bekler.

Yani, komut notepadsadece Not Defteri uygulamasını başlatır ve uygulamanın kontrolünü bırakır. Komut, komut isteminin ipconfigbir etki alanı altında (hayır, bu uygulama etki alanı değildir ) çalışır.

Aşırı derecede genellemek gerekirse Process.Start, C # eşdeğerinizi kullandığınızda beklemeyin. Zaten olmayacak.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.