Влияет ли команда more в Windows только на вывод или на выполнение команды?

Я запускаю сборку программного обеспечения в Visual Studio 2005 на Win XP через командную строку (devenv.exe /rebuild). Я все-таки перебросил его, а потом понял, что не хочу, чтобы он сидел с ребенком, поэтому я больше ушел с Q. Теперь я ничего не вижу в окне CMD. Работает ли команда как обычно, больше просто буферизует и отображает STDOUT, и будет ли она продолжать работать, несмотря на то, что больше было завершено, или эта сборка теперь никогда не завершится?

2 ответа

Интересный вопрос!

Процесс, который вы добавили в БОЛЬШЕ, будет продолжаться до его естественного завершения или до тех пор, пока вы его не убьете. Вот тест, чтобы показать это:

Откройте 2 окна cmd.

В командной строке: ping -n 120 127.0.0.1 | Больше

По приглашению два запустите: список задач | findstr / я пингую

Пинг будет выполняться в течение примерно 120 секунд, но при использовании стандартного окна cmd страница заполнится за меньшее время (измените команду ping соответствующим образом).

Во второй подсказке вы можете показать, что PING продолжает работать независимо от того, убили ли вы БОЛЬШЕ клавишей "Q". Только после полного удаления команды PING с помощью ctrl+C или ожидания полных 50 секунд, ping останавливается.

Да, more буферы и процесс продолжает выполняться, даже если вы не прокручиваете вывод.

Если вы выходите more рано, хотя, nonexistent pipe ошибки появляются при некоторых обстоятельствах. По-видимому, это не влияет на выполнение и, вероятно, связано с используемым методом тестирования.


Мы можем протестировать с помощью простого командного файла:

@echo off
for /l %%a in (1,1,100) do echo %%a
msg * done

По трубопроводу это в more очевидно, что процесс продолжает выполняться независимо от того, more прокручивается или нет: мы видим done сообщение без продвижения more,

Однако, если мы увеличим время выполнения, как это так, и выйти more с q середина команда:

@echo off
for /l %%a in (1,1,10000) do echo %%a
msg * done

Мы получаем много сообщений об ошибках:

The process tried to write to a nonexistent pipe.

Окно сообщения все еще появляется. Повторное тестирование с простой программой на C# или C не повторяет это поведение. Я предполагаю, что если поток уже открыт, он будет работать как обычно (без вывода) - но echo Команда, использованная в вышеприведенных тестах, на самом деле пытается каждый раз открывать поток заново, и когда канал назначения закрыт, это уже невозможно.

Другие вопросы по тегам