Решено: Программное перенаправление stdin (Qt)

Модератор: Модераторы разделов

Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Решено: Программное перенаправление stdin

Сообщение deninok »

Уважаемые участники форума!

Подскажите, пожалуйста, как перенаправить стандартный поток ввода?

Есть программа А. Она должна запустить программу B, которая в свою очередь (на определённом этапе выполнения) ожидает от пользователя ввода (например, строки). Требуется, чтобы программа А заменила собой пользователя и сама обеспечила ввод строки.

Делаю нечто подобное...

Код: Выделить всё

#include <QProcess>

int main() {
    QString program( "B" );   // Исполняемый файл программы В существует и лежит здесь, в корне.
    QStringList arguments;
    arguments << "";

    QProcess prog;
    prog.setStandardInputFile( "stdin" );    // Файл существует, доступ разрешён.

    prog.execute( program, arguments );

    return 0;
}


В файле stdin уже записана некоторая строка. Я хочу, чтобы, когда программа B запросит ввод от пользователя, ожидаемая ею строка взялась из данного файла.
Однако такой код не работает.

Что делать, куда копать? Заранее благодарен за помощь.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Решено: Программное перенаправление stdin

Сообщение deninok »

Проблема в том, что в Qt Assistant, к сожалению, не приводится программного примера использования функции setStandardInputFile(). Сказано лишь, что её вызов после запуска соответствующего процесса бесполезен (что, в общем-то, и так понятно).

Строго говоря, можно решить эту проблему с помощью манипуляций с системными дескрипторами процесса (применяя вызовы ::open(), ::dup() и ::close()), однако это не совсем кошерно (нужно вставлять разные заголовочники для Windows и Linux, ведь решение мне нужно кроссплатформенное).
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: Решено: Программное перенаправление stdin

Сообщение Stauffenberg »

deninok писал(а):
10.03.2009 17:17
Подскажите, пожалуйста, как перенаправить стандартный поток ввода?

readAllStandardOutput()

не то?

Ах, не заметил, что Вы просите из файла считать инфу... подумал из стандартного вывода...

Код: Выделить всё

QFile file("in.txt");
     if (!file.open(QIODevice::ReadOnly | QIODevice::Text))
         return;

     while (!file.atEnd()) {
         QByteArray line = file.readLine();
         process_line(line);
     }
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Решено: Программное перенаправление stdin

Сообщение deninok »

Простите, но я не понял, зачем вы привели этот код. Как читать из файла я знаю, однако мне нужно заменить файлом стандартный ввод (stdin) порождённого процесса.
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: Решено: Программное перенаправление stdin

Сообщение Stauffenberg »

deninok писал(а):
10.03.2009 20:48
Простите, но я не понял, зачем вы привели этот код. Как читать из файла я знаю, однако мне нужно заменить файлом стандартный ввод (stdin) порождённого процесса.

Сорри, только сейчас понял, что Вы хотите =)
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Решено: Программное перенаправление stdin

Сообщение deninok »

Ну неужели никто не сталкивался с такой задачей?.. :(
Задал этот же вопрос на русскоязычном Qt форуме, там тоже молчат...
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Решено: Программное перенаправление stdin

Сообщение diesel »

deninok писал(а):
10.03.2009 17:17
Подскажите, пожалуйста, как перенаправить стандартный поток ввода?

судя по описанию Вы пытаетесь делать то что делает утилита expect(то есть можно в те исходники заглянуть) - это не совсем перенаправление стандартного потока ввода(того который stdin). грубо говоря, судя по описанию, Вы пытаетесь запустить ssh, и взять из файла username и password, но перенаправлению stdin для ssh ничего не даст - мы же не можем просто cat "username" | ssh.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Решено: Программное перенаправление stdin

Сообщение deninok »

(diesel) писал(а):грубо говоря, судя по описанию, Вы пытаетесь запустить ssh, и взять из файла username и password, но перенаправлению stdin для ssh ничего не даст - мы же не можем просто cat "username" | ssh.

Я чуть со стула не упал! Да, я действительно хочу программно запустить ssh, чтобы username и password брались из файла. Но откуда вы об этом узнали?

Впрочем, эмоции в сторону. Если перенаправление stdin для этой задачи не подходит, тогда как это сделать?
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Решено: Программное перенаправление stdin

Сообщение diesel »

deninok писал(а):
11.03.2009 11:09
(diesel) писал(а):грубо говоря, судя по описанию, Вы пытаетесь запустить ssh, и взять из файла username и password, но перенаправлению stdin для ssh ничего не даст - мы же не можем просто cat "username" | ssh.

Я чуть со стула не упал! Да, я действительно хочу программно запустить ssh, чтобы username и password брались из файла. Но откуда вы об этом узнали?

это самый очевидный пример когда нужно вбивать руками логин с паролем
Спасибо сказали:
Аватара пользователя
Denjs
Сообщения: 1685
ОС: SuSe 10.2

Re: Решено: Программное перенаправление stdin

Сообщение Denjs »

deninok писал(а):
11.03.2009 11:09
(diesel) писал(а):грубо говоря, судя по описанию, Вы пытаетесь запустить ssh, и взять из файла username и password, но перенаправлению stdin для ssh ничего не даст - мы же не можем просто cat "username" | ssh.

Я чуть со стула не упал! Да, я действительно хочу программно запустить ssh, чтобы username и password брались из файла. Но откуда вы об этом узнали?

Впрочем, эмоции в сторону. Если перенаправление stdin для этой задачи не подходит, тогда как это сделать?

Видимо не вы один ходили этими граблями)))
для ssh есть соответсвующие опции для пользователи и кажется пароля тоже...
ну в крайнем случае можно(? судя по некоторым источникам) настроить беспарольную авторизацию по электронному ключу...

PS: Ну в крайнем случае можно пересобрать SSH, добавив туда не стандартную опцию для пароля <_<
PPS: Подозреваю можно переконфигурировать сервер - где-то там была опция "BatchMode no", или yes соответвенно (судя по некоторым источникам)...
# Режим скрипта, когда не спрашиваются пароли с терминала. По умолчанию no
BatchMode no
QDroid - Среда исполнения и фреймворк для QtScript.
OTPD - Открытые драйвера промышленных принтеров чеков и этикеток (кроссплатформенная подсистема печати).
Спасибо сказали:
Аватара пользователя
diesel
Бывший модератор
Сообщения: 5989
ОС: OS X, openSuSE, ROSA, Debian

Re: Решено: Программное перенаправление stdin

Сообщение diesel »

deninok писал(а):
11.03.2009 11:09
Впрочем, эмоции в сторону. Если перенаправление stdin для этой задачи не подходит, тогда как это сделать?

если бы речь шла про shell/CLI, Вам бы сказали: или используйте ключи, или expect, например вот пример: Решено: Запуск скриптов по SSH через сеть

с QT сложно сказать.
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Решено: Программное перенаправление stdin

Сообщение deninok »

В том-то и дело, что мне нужно решение с Qt (в идеале).

Впрочем, решение уже нашёл. Можно попробовать использовать libexpect непосредственно из моего С++-кода.
Спасибо сказали:
Аватара пользователя
Folderx
Сообщения: 296
ОС: fedora, mandriva

Re: Решено: Программное перенаправление stdin

Сообщение Folderx »

freopen ?

Код: Выделить всё

    FILE *fp;
    char line[MAXLINE];

    if ((fp = freopen("file.txt", "rb", stdin)) == NULL)
        return 1;
    fgets(line, MAXLINE, fp);
Спасибо сказали:
Аватара пользователя
Stauffenberg
Сообщения: 2041
Статус: ☮ PEACE ☮
ОС: открытая и свободная

Re: Решено: Программное перенаправление stdin

Сообщение Stauffenberg »

deninok писал(а):
11.03.2009 11:22
Можно попробовать использовать libexpect непосредственно из моего С++-кода.

А межплатформенность от этого не пострадает? Хотя вряд ли...

з.ы.http://www.developerweb.net/forum/showthread.php?t=3816
Labor omnia vincit

"Debugging is twice as hard as writing the code in the first place.
Therefore, if you write the code as cleverly as possible, you are, by definition, not smart enough to debug it.” (Brian Kernighan)
Спасибо сказали:
Аватара пользователя
deninok
Сообщения: 585
Статус: Программист С++
ОС: Debian GNU/Linux

Re: Решено: Программное перенаправление stdin

Сообщение deninok »

Нет, на самом деле решение я нашёл совсем иное: использовать стороннюю С++-библиотеку, обеспечивающую работу с SSH. Собственно, именно это мне и было нужно. :)

Всем спасибо за помощь, тему можно закрывать.
Спасибо сказали: