3

c++ QT4 アプリケーションが Linux コマンドから結果を読み取るように強制する必要があります。私は Qprocess を使用しようとしていますが、コマンドが複雑になるとすぐに、何らかの形で混乱し (推測だけ)、機能しません。

ここで私はあなたのために小さな例を作ろうとします:

QProcess process;
command = "ls -l | grep a | sort";
qDebug() << "Execute command -> "+command;
process.start( command );
process.waitForFinished(-1);
QString processStdout = process.readAllStandardOutput();
QString processStderr = process.readAllStandardError();
qDebug() << "Std out -> "+processStdout;
qDebug() << "Std err -> "+processStderr;

これは印刷されます:

Execute command -> ls -l | grep a | sort
"Std out -> " 
"Std err -> ls: |: No such file or directory

while をコンソールから実行すると、ファイル名が正しく出力されます。

コマンドをもっと単純なものに置き換えると、スムーズに command = "ls -l";動作します。エラーは、OS によって標準エラーで返されます。

したがって、コマンドに使用される Qstring が何らかの形で操作されると思います。何が起こっているかについて何か考えはありますか?

4

4 に答える 4

7

QProcessシェルコマンドをサポートしていません。したがって、パイプ記号はシェルによって解釈されず、直接 に渡されlsます。 lsはそれをファイル名として解釈し、 という名前のファイルが明らかに存在しないため、文句を言います|

QProcess オブジェクトの入力ストリームと出力ストリームをリダイレクトして、手動でパイプをセットアップする必要があります。これを行う方法については、ドキュメントを参照してください。

一般的に、シェル コマンドを回避し、代わりに Qt のクラスと関数に依存する方法を説明します。greporを呼び出す必要はまったくありません。これは、とlsを使用して同じことを簡単に実行できるためです。サブプロセスを実行する必要がある場合は、オーバーロードを使用してすべての引数をリストとして渡し、引用の問題を回避します。QRegExpQDir::start(const QString&, const QStringList&, OpenMode)

于 2011-09-29T12:15:19.943 に答える
4

これを試して :

QProcessからシェルを実行し、引数をシェルに渡します。例 :

QStringList options;
options << "-c" << "ls -l | grep a | sort";
QProcess process;
process.start("/bin/sh", options); //Use sh or another shell 

これが機能したかどうかを教えてください。

于 2011-09-29T14:04:05.757 に答える
0
command = "ls -l | grep a | sort";

実際にはプロセスではなく、ls、grep、および sort の 3 つの異なるプロセスのパイプラインです。

于 2011-09-29T14:20:33.267 に答える
-1

助けてくれてありがとう。

私が必要なことをするために、私は以下を使ってアプローチを変えなければなりませんでした:

std::string cmd("/sbin/ifconfig eth0");
FILE* pfd = popen(cmd.c_str(), "r");

if (pfd)
{
  while (!feof(pfd))
  {
    char buf[1024] = {0};

    if (fgets(buf, sizeof(buf), pfd) > 0)
    {
      std::cout << "buf = " << buf;    // a newline is already present
    }
  }
  pclose(pfd);
}
于 2011-09-29T14:34:07.723 に答える