#c #cmd #stdout #pipe #stdin
#c #cmd #стандартный вывод #канал #стандартный ввод
Вопрос:
Я пытаюсь создать канал между оболочкой командной строки и моим приложением.
Это код, который у меня есть до сих пор: http://pastebin.com/uupd4aXi
То, что я пытаюсь сделать, это написать «whoami» в stdin и получить возврат, эквивалентный этой команде. Если я закомментирую функцию writeinput, readoutput успешно распечатает стандартную распечатку cmd. Однако, если я этого не сделаю, writeinput застревает в бесконечном цикле при:
for (;;)
{
bSuccess = WriteFile(hSTD_IN_WRITE, chBuf, sizeof(chBuf), amp;dwWritten, NULL);
if ( ! bSuccess ) break;
}
Если я удалю оператор if и вручную вызову прерывание цикла, я по-прежнему получаю только сообщение о распечатке cmd, но не ответ на мою команду «whoami».
Что я делаю не так?
Ответ №1:
Вы попадаете в ловушку перенаправления как stdin, так и stout, но обрабатываете их последовательно.
Если все, что вы хотите сделать, это запустить whoami
программу и захватить выходные данные, тогда вам не нужно cmd.exe
и пытаться перекачивать whoami.exe
в качестве входных данных. Просто запустите whoami.exe
напрямую и запишите его вывод.
РЕДАКТИРОВАТЬ: обновлена ссылка на статью: https://devblogs.microsoft.com/oldnewthing/20110707-00/?p=10223
Комментарии:
1. Спасибо за ответ, но, к сожалению, команда «whoami» была всего лишь примером, поэтому я не могу просто запустить whoami.exe , что произойдет, если я захочу получить результат, скажем, «echo 1». В этой статье говорится об использовании буферизации, но я не совсем понимаю, что это значит, можете ли вы мне в этом помочь
2.
cmd.exe /c echo 1
выполнит команду, не требуя от вас ввода данных через стандартный интерфейс. Он также избавляется от баннера, так что двух зайцев одним выстрелом.3. Спасибо! Наконец-то все заработало. Хотя это кажется мне обходным решением, оно, безусловно, выполняет свою работу. Однако мне было бы любопытно найти «правильный» способ сделать это
4. См. Пункт «чтобы избежать этой проблемы» в конце статьи.