Сбой функции записи вызова QProcess

Мне нужно вызвать QProcess, чтобы запустить xterm, после чего я должен отправить ему некоторые данные. почему этот код не может работать правильно?

QProcess proc;
proc.start("xterm");
proc.waitForStarted();
proc.write("ls\n");
proc.waitForFinished();
proc.waitForBytesWritten();
qDebug()<<proc.readAllStandardOutput();//output: nothing
qDebug()<<proc.errorString();//output: "write error"

Спасибо за помощь


person tangbongbong    schedule 24.02.2013    source источник
comment
Большинство функций, которые вы вызываете, имеют возвращаемые значения. Как насчет проверки этих возвращаемых значений и поиска того, что пошло не так?   -  person    schedule 24.02.2013
comment
Я уже пробовал это, все в порядке, но последнее утверждение   -  person tangbongbong    schedule 25.02.2013
comment
что значит не может нормально работать? Он висит? Или ничего не печатает в потоке отладки? Я не вижу причин, по которым xterm должен завершить свою работу, поэтому, вероятно, ваш код зависает на proc.waitForFinished();   -  person Marek R    schedule 25.02.2013


Ответы (1)


Не совсем понятно, что вы пытаетесь здесь сделать. Ваш код не имеет смысла: вы не можете отправить xterm «некоторые данные» (похоже, вы хотите, чтобы он выполнил какую-то команду для вас, здесь ls) на его стандартный ввод.

Если вам нужен вывод ls, просто сделайте следующее:

QProcess proc;
proc.start("ls");
proc.waitForFinished();
qDebug() << proc.readAllStandardOutput();

Если вы хотите, чтобы интерпретатор работал в фоновом режиме, чтобы вы могли отправлять команды для его выполнения (например, оболочка), вы можете сделать что-то вроде:

QProcess proc;
proc.start("/bin/sh");
proc.waitForStarted();
Q_FOREACH( QString cmd, QStringList() << "ls" << "date" << "echo test" )
{
    proc.write((cmd + "\n").toLocal8Bit());
    proc.waitForReadyRead();
    qDebug() << proc.readAllStandardOutput().split('\n');
}
proc.write("exit\n");
proc.waitForFinished();
person axxel    schedule 24.02.2013
comment
Спасибо за вашу помощь, сэр. Я знаю, как вызвать команду напрямую, что мне действительно нужно, так это вызвать qemu в консоли, после инициализации qemu я должен ввести некоторую информацию (используя QProcess?), например, пользователя и пароль. Настоящая проблема здесь в том, почему я не могу отправить данные в xterm? извините за мой английский, английский не мой родной язык - person tangbongbong; 25.02.2013
comment
Я ничего не знаю о qemu, но, возможно, вам следует взглянуть на раздел Получение данных в/из эмулятора в этот документ. По-видимому, вы можете делать такие вещи, как подключение смоделированного последовательного порта к stdin/stdout quemu, а затем связываться с ним, как с оболочкой выше. Однако я нигде не вижу xterm на этой картинке. Очень может быть, что то, что вы пытаетесь сделать, невозможно. Я предлагаю изменить заголовок вашего вопроса на что-то более описательное, например «Как удаленно управлять qemu из внешнего процесса?». - person axxel; 25.02.2013
comment
Еще раз спасибо, вы мне уже очень помогли. В любом случае, я все еще не могу отправить данные в xterm, я изучу ваш документ. Я пробовал proc.start("sh -c \"echo password | sudo -S command\" ") . Это может работать для меня, но не лучшее решение. Я буду держать в вопросе это. - person tangbongbong; 27.02.2013
comment
Добро пожаловать. Я до сих пор не понимаю, что ты пытаешься сделать. Какое отношение имеют друг к другу xterm, sudo и qemu? Я думаю, вы должны попытаться описать, что вы действительно пытаетесь сделать здесь (и изменить заголовок вопроса, чтобы он был более описательным). - person axxel; 27.02.2013