2009-03-14 25 views
106

可能性の重複:
How can I run an external program from C and parse its output?C:システムコマンドを実行して出力を取得しますか?

私は、Linuxでコマンドを実行すると、テキストはそれが出力するもので返されますが、私はこのテキストが画面に印刷されたくないん。一時ファイルを作るよりもエレガントな方法がありますか?

+1

既に繰り返し説明されています。 – dmckee

+5

重複としてマークされていますが、指していません。私はこれが完璧な解決策だとは思わない。同時にあなたは重複していると言って、私たちにそれを指摘します。またはより良い!複製された記者の数に基づいてリダイレクトを作成する。 – erm3nda

答えて

4

何らかのプロセス間通信が必要です。 pipeまたは共有バッファを使用してください。

198

"popen"機能が必要です。次に、コマンド "ls/etc"を実行してコンソールに出力する例を示します。

#include <stdio.h> 
#include <stdlib.h> 


int main(int argc, char *argv[]) 
{ 

    FILE *fp; 
    char path[1035]; 

    /* Open the command for reading. */ 
    fp = popen("/bin/ls /etc/", "r"); 
    if (fp == NULL) { 
    printf("Failed to run command\n"); 
    exit(1); 
    } 

    /* Read the output a line at a time - output it. */ 
    while (fgets(path, sizeof(path)-1, fp) != NULL) { 
    printf("%s", path); 
    } 

    /* close */ 
    pclose(fp); 

    return 0; 
} 
+1

stderrをstdoutにリダイレクトするとよいでしょう。そうすれば、エラーを捕捉できます。 –

+0

stderrをstdoutにリダイレクトする方法はありますか? –

+8

あなたは 'sizeof(path)-1'ではなく、' fgets(path、sizeof(path)、fp) 'を使うべきです。マニュアルを読む – user102008

-6

通常、コマンドが外部プログラムであれば、ここでお手伝いすることができます。

command > file_output.txt 

だからあなたのCコードは、次にあなたがfile_output.txtファイルを使用することができます

exec("command > file_output.txt"); 

のようなものをやっているでしょう。

+1

ポスターは、一時ファイルの使用を明示的に排除しましたが、場合によっては有効なアプローチです。静的ファイル名を使用しないでください。セキュアなランダムファイル名を使用するか、セキュリティ上の問題であるシンボリックリンクを開くようにしてください。 –

+5

execに渡される引数がシェルコマンドではないため、この答えは完全に間違っています。 – Alnitak

+0

@Alnitakしかし、これは例です。引数が実際のコマンドではないかどうかは気になります - 明らかにコマンドではない*コマンドではありませんか? –

関連する問題