1

こんにちは私はインターネットでいくつかの解決策を見ました、それらはすべて基本的にファイルを作成しています、しかし私はそれらをcharの配列に保存したいと思います。速度は私にとって非常に重要であり、ハードドライブでの作業に時間を費やしたくありません。だからpopen()私にとって本当の解決策ではありません。

4

5 に答える 5

6

以下は実際のコード スニペットです。

char bash_cmd[256] = "ls -l";
char buffer[1000];
FILE *pipe;
int len; 

pipe = popen(bash_cmd, "r");

if (NULL == pipe) {
    perror("pipe");
    exit(1);
} 

fgets(buffer, sizeof(buffer), pipe);

len = strlen(buffer);
buffer[len-1] = '\0'; 

pclose(pipe);
于 2013-01-18T09:44:36.110 に答える
2

popenのマンページを読むと、次のことに気付くでしょう。

popen()関数は、パイプを作成し、フォークし、シェルを呼び出すことによってプロセスを開きます。[...] popen()からの戻り値は、fclose(3)ではなくpclose()で閉じる必要があることを除けば、あらゆる点で通常の標準I/Oストリームです。[...] 「popened」ストリームから読み取ると、コマンドの標準出力が読み取られます。コマンドの標準入力は、popen()を呼び出したプロセスの入力と同じです。

(強調鉱山)

ご覧のとおり、を呼び出すと、コマンドがI / Oストリームを介してプログラムにパイプされますpopen。これは、ディスクI / Oとはまったく関係がなく、オペレーティングシステムによって管理されるプロセス間通信とは関係ありません。stdout

(補足として:一般的な問題を解決するために、理由の範囲内でオペレーティングシステムの基本機能に依存することは一般的に良い考えです。そしてあなたpopenの一部であるPOSIX.1-2001ため、すべての標準に準拠したオペレーティングシステムで利用できることを信頼できます。ウィンドウズ)

編集:もっと知りたい場合は、これを読んでください:http: //linux.die.net/man/3/popen

于 2013-01-18T08:28:37.683 に答える
2

「時期尚早の最適化は諸悪の根源である」というクヌースの言葉を決して忘れないでください。問題が発生するまでパフォーマンスについて心配する必要はありません。非常にまれな状況を除いて、時間の価値はプログラムの実行コストよりもはるかに高くなります。

Jon Bentley の "効率的なプログラムの作成" (残念ながら絶版、彼の"Programming Pearls"の 1 つの章は要約です) は、プログラムをより速く実行する方法についての詳細な議論です (価値がある場合)。最後の手段としてのみ、可能な限り最後の2%のパフォーマンスを絞り出すために(実行時間を半分に削減した後)、提案したような変更を使用することをお勧めします。引用された本には、完全に無駄だった「パフォーマンスの最適化」の非常に面白い戦争の話が含まれています (使用されていないコードを最適化し、オペレーティング システムが親指をいじる間に実行されるコードを最適化します...)。

于 2013-01-20T02:16:48.487 に答える
0

速度が重要な場合は、独自のバージョンの popen を作成できます。

popen() - パイプを作成します - フォーク - シェルを実行します (非常に高価です!) - シェルはパイプを作成し、フォークし、プログラムを実行します

カスタマイズしたバージョンでは、手順を次のように減らすことができます: - パイプを作成する - フォークする - プログラムを実行する

popen を拡張して、コマンド STDOUT、STDERR、および STDIN を個別に制御することもできます。私はそのようなルーチンを書きました。https://github.com/rockdaboot/mget/blob/master/libmget/pipe.cを参照してください。 これは GPL です。

FILE ポインタを指定して mget_popen3() を呼び出すか、ファイル記述子を指定して mget_fd_popen3() を呼び出します。少なくとも、それを行う方法についてのアイデアを提供する必要があります。

于 2013-01-18T09:00:46.510 に答える
-2

複数の C プログラムを使用してもかまいませんか?そうでない場合は、コマンド ライン引数を使用できます。最初のCプログラムでは、次のことができます

system("YourCommand | SecondProgram");

これSecondProgramは、作成する 2 番目の C プログラムの「実行可能ファイル」になります。YourCommand2 番目の C プログラムでは、コマンドの出力を.xml ファイルのコマンド ライン引数として受け取ることができますSecondProgram。その目的のために、次のように 2 番目の C プログラムの main() を開始できます。

main(int argc,char *argv[])

配列argvには の出力がありYourCommandargc配列内の要素の数が含まれますargv

于 2013-01-18T07:09:40.200 に答える