2016-05-24 4 views
2

Я пытался отправить данные в stdin запущенного процесса. Вот что я делаю:Отправка данных в stdin другого процесса через linux-терминал

  1. В терминале я запустил программу на C++, которая просто читает строку и печатает ее. Код выдержка:

    while (true) { 
        cin >> s; 
        cout << "I've just read " << s << endl; 
    } 
    
  2. я получаю PID текущей программы

  3. я иду /proc/PID/fd/
  4. исполняю echo text > 0

Результат: text появляется в терминале, где программа запустить. Примечание: не I've just read text, а просто text. Что я делаю неправильно и что мне делать, чтобы получить эту штуку для печати 'I've just read text'?

+0

Как выполнить программу из оболочки? Вы запускаете его как фоновый процесс? – Slava

+0

Нет, я просто забегаю на переднем плане. Что-то меняет? –

ответ

0

Когда вы начинаете вашу программу на C++, Вы должны убедиться, что его вход поступает из трубы, но не с терминала. Вы можете использовать cat | myapp. После его запуска вы можете использовать PID вашего приложения для echo text > /proc/PID/fd/0

+0

Спасибо! Это работало как шарм! –

0

Это может быть вопрос stdout не должным образом промытым - см. "Unix Buffering". Или вы можете быть в другой оболочке, как предложили некоторые комментаторы.

В целом, более надежно обрабатывать базовую межпроцессную связь через FIFO или NODs - именованные каналы. (Или же перенаправлять stdout и/или stderr в файл и считаны из этого с c++ программы.)

Вот некоторые хорошие ресурсы о том, как использовать их как в терминале и c++.

«FIFO – Named pipes: mkfifo, mknod»
«Using Pipes in Linux Processes»
«Programming with FIFO: mkfifo(), mknod()»

+0

Это замечательно, спасибо. Я пробовал использовать трубы, но решил сделать как можно проще, и он все еще не работает. –

0

FD 0 - это терминал, с которого работает программа. Когда вы пишете на FD 0, вы пишете на терминал, из которого запущена программа. FD 0 не требуется открывать в режиме только для чтения; на практике это похоже на режим чтения/записи, поэтому вы можете писать на него. (Я подозреваю, что это связано с тем, что FDs 0, 1 и 2 относятся к одному и тому же файлу)

Так echo text > /proc/PID/fd/0 просто эхо text к терминалу.

Для ввода ввода в программу вам нужно будет записать на другой конец трубы (на самом деле это PTY, который в основном ведет себя как пара трубок). Скорее всего, любой конечный эмулятор, который вы используете (xterm, konsole, gnome-terminal), будет открытым на другом конце, поэтому вы можете попробовать написать это.

Смежные вопросы