6

Linux コマンドの出力文字列と C++ プログラムのコマンド出力ステータスを取得したいと考えています。アプリケーションで Linux コマンドを実行しています。

例: コマンド:

rmdir abcd

コマンド出力文字列:

rmdir: `abcd' の削除に失敗しました: そのようなファイルまたはディレクトリはありません

コマンド ステータス:

1 (コマンドが失敗したことを意味します)

system()出力ステータスを取得する Linux 関数とコマンドの出力文字列を取得する関数を使用してみpopen()ましたが、どちらの関数も Linux コマンドの出力文字列と出力ステータスの両方を取得できません。

4

5 に答える 5

7

出力文字列は、標準出力または標準エラー記述子 (それぞれ 1 または 2) にあります。

これらのストリームを(見て関数を見て)、それらを読み取ることができる場所(たとえば、 POSIX )にリダイレクトするdup必要dup2がありますpipe

Cでは、次のようなことをします:

int pd[2];
int retValue;
char buffer[MAXBUF] = {0};
pipe(pd);
dup2(pd[1],1);
retValue = system("your command");
read(pd[0], buffer, MAXBUF);

これで、出力 (の一部) が buffer にあり、戻りコードが retValue にあります。

または、関数 from exec(つまり) を使用して、またはexecveで戻り値を取得することもできます。waitwaitpid

更新: これにより、標準出力のみがリダイレクトされます。標準エラーをリダイレクトするには、 を使用しますdup2(pd[1],1)

于 2013-04-02T12:41:45.167 に答える
3

最も簡単な解決策は、 を使用systemし、標準出力と標準エラーを一時ファイルにリダイレクトすることです。一時ファイルは後で削除できます。

于 2013-04-02T13:17:19.373 に答える