Перенаправление Stdin / Stdout, ввод не работает

#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. См. Пункт «чтобы избежать этой проблемы» в конце статьи.