Як командний рядок знає, коли чекати виходу?


90

Я намагався перекодувати командний рядок Windows у C #. Мені було цікаво, як командний рядок знає, коли чекати, поки процес почне виходити, а коли не чекати виходу викликаного процесу.

Наприклад, якщо ви введете в командному рядку "блокнот", Блокнот запуститься, але ви все одно можете виконати інші команди. Однак, якщо ви відкриєте утиліту, таку як more.com, ping.exe, або іншу утиліту, вона буде чекати завершення програми, що виконується, перш ніж дозволити вам виконати іншу команду.

Як командний рядок знає, коли слід чекати виходу, і як цю поведінку можна емулювати в C #?


13
Чудове перше питання!
Ротем

2
На самому базовому рівні викликаються програми, засновані на графічному інтерфейсі, і виконання повертається до запиту. Це може бути тому, що оболонка не очікує, що команда взаємодіє з нею?
shahkalpesh

Відповіді:


122

Якщо програма є програмою графічного інтерфейсу Win32, вона просто запуститься, і командний рядок не буде чекати її виходу.

Якщо програма є консольною програмою, вона запускатиметься в командному рядку, і вам потрібно буде почекати, поки вона закінчиться, щоб повернути командний рядок назад.

РЕДАГУВАТИ:

ГАРАЗД. Здається, вам потрібно технічне пояснення. Якщо ви хочете імітувати ту саму функцію у своїй програмі, ви можете перевірити IMAGE_OPTIONAL_HEADERфайли EXE тут .

Всередині IMAGE_OPTIONAL_HEADERзнаходиться:

 WORD                 Subsystem;

If SubSystem == 0x02 це означає, що це програма з графічним інтерфейсом.

If SubSystem == 0x03 це означає, що це програма командного рядка.

РЕДАКТУВАТИ 2:

Якщо ви хочете побачити це в дії:

  1. Завантажте http://www.ntcore.com/exsuite.php

  2. Скопіюйте calc.exe або notepad.exe на робочий стіл

  3. Відкрийте скопійований calc.exe у провіднику CFF

  4. Перейдіть до заголовків Nt -> Необов’язкові заголовки

  5. Змініть підсистему з 0x002 на 0x003

  6. Збережи це

Тепер запустіть новий модифікований calc, і ви побачите, що в командному рядку чекає його завершення.


2
@SudhakarTillapudi, ласкаво просимо, я оновив відповідь із докладнішими деталями, сподіваюся, це пояснить більше.
72DFBF5B A0DF5BE9

3
це справді інформативно ще раз дякую за те, що ви мене залишили :)
Судхакар Тіллапуді

8

За замовчуванням у командному рядку виникає програма GUI в окремому процесі / форці. Однак ви можете запустити блокнот (або іншу програму графічного інтерфейсу) вбудовано за допомогою сценарію командного рядка / оболонки:

start /w notepad.exe

Таким чином, сценарій командного рядка / оболонки продовжується лише після завершення процесу notepad.exe.

Сподіваюся, це допомагає, TW


3

Коли ви запускаєте новий процес, програму графічного інтерфейсу в цьому контексті, яка фактично працює за межами запиту, підказка не буде чекати. Але якщо ви запустите команду, яка працює повністю в межах поточного екземпляра підказки, вона чекає.

Отже, команда notepadпросто запускає програму Блокнот і залишає контроль над програмою. Поки команда ipconfigвиконується під доменом (це не є доменом додатка ) підказки.

Щоб вкрай узагальнити, коли ви використовуєте Process.Startв своєму еквіваленті C #, не чекайте. Це все одно не буде.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.