Как командная строка знает, когда ждать выхода?

90

Я пытался перекодировать командную строку Windows на C #. Мне было интересно, как командная строка знает, когда ждать завершения процесса, а когда не ждать завершения вызываемого процесса.

Например, если вы введете в командной строке «блокнот», Блокнот запустится, но вы все равно сможете выполнять другие команды. Однако, если вы откроете такую ​​утилиту, как more.com, ping.exe или другую утилиту, она будет ждать завершения выполняющейся программы, прежде чем позволить вам выполнить другую команду.

Как командная строка узнает, когда ждать выхода, и как можно эмулировать это поведение в C #?

Джастин Крейча
источник
13
Отличный первый вопрос!
Rotem
2
На самом базовом уровне вызываются программы на основе графического интерфейса пользователя, и выполнение возвращается к приглашению. Это может быть потому, что оболочка не ожидает, что команда будет с ней взаимодействовать?
Shahkalpesh 08

Ответы:

122

Если приложение представляет собой приложение с графическим интерфейсом Win32, оно просто запустится, а командная строка не будет ждать его выхода.

Если приложение является консольным, оно будет запускаться в командной строке, и вам нужно будет дождаться его завершения, чтобы вернуть командную строку.

РЕДАКТИРОВАТЬ:

ОК. Похоже, вам нужно техническое объяснение. Если вы хотите эмулировать ту же функцию в своем приложении, вы можете проверить IMAGE_OPTIONAL_HEADEREXE-файлы здесь .

Внутри 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 Explorer

  4. Перейдите к заголовкам Nt -> Дополнительные заголовки

  5. Измените подсистему с 0x002 на 0x003

  6. Сохрани это

Теперь запустите новый измененный calc, и вы увидите, что командная строка ожидает завершения работы.

72DFBF5B A0DF5BE9
источник
2
@SudhakarTillapudi, пожалуйста, я обновил ответ более подробной информацией, надеюсь, он объяснит больше.
72DFBF5B A0DF5BE9 08
3
это действительно информативно, еще раз спасибо, что остались со мной :)
Судхакар Тиллапуди
8

По умолчанию из командной строки программа с графическим интерфейсом запускается в отдельном процессе / вилке. Тем не менее, вы можете запустить блокнот (или другую программу с графическим интерфейсом) прямо в командной строке / сценарии оболочки:

start /w notepad.exe

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

Надеюсь, это поможет, TW

Тв Берт
источник
3

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

Итак, команда notepadпросто запускает приложение «Блокнот» и оставляет управление приложением. В то время как команда ipconfigвыполняется в домене (нет, это не домен приложения ) приглашения.

В общем, когда вы используете Process.Startв своем эквиваленте C #, не ждите. Все равно не будет.

датский
источник