2016-04-06 14 views
0

Cプログラム内からシェルコマンドを実行しようとしています。プログラムからexecの出力をパラメータ参照で返す

私は、コマンド自体の終了コードを返し、パラメータ参照変数を使用してプログラムの実際の出力を返すラッパー関数を作成しました。

exec関数のラッパーは次のようになります。

int _exec(const void *command, char **result) { 
    FILE *fp; 
    char path[1035]; 
    char *eof; 

    /* Open the command for reading. */ 
    fp = popen(command, "r"); 
    if (fp == NULL) { 
     return -1; 
    } 

    while((eof = fgets(path, sizeof(path), fp)) != NULL); 

    /* Fill the parameter reference */ 
    *result = strdup(path); 

    /* close */ 
    pclose(fp); 
    return 0; 
} 

呼び出す部分は次のようになります。呼び出す部分で残念ながら

int result = 0; 
char *tmp; 

result =_exec("ls /", &tmp); 
printf("%s", tmp); 

、I printftmp、それが唯一の最後の行が含まれている場合コマンド出力の

私が間違っていることは何ですか?すべての行を*resultのintにすると、tmpにどうすればいいですか?

答えて

2

fgetsの代わりにfreadを使用してください。 fgetsは各改行文字で読み込みを停止しますが、バッファのpathバッファの最初の位置にすべての行を保存しています。また、既に存在しているバイト数を追跡​​する必要があります。path、読み取り機能を呼び出すたびにデータを最初の未使用位置pathに保存する必要があります。

+0

私は 'fread'を試しても全く動作しません:' fread(* result、1、sizeof(char *)、fp); ' – lockdoc

+0

パラメータとして渡すものを知るには' fread'のドキュメントを読んでください。以前のように、最初のものは 'path'です。 'count'にはあなたのバッファのサイズ' sizeof(path) 'を渡します。それは行末を過ぎて読み取ることはありません。実際には、すべてのデータを読み取らないかのように 'while'ループは必要ありません。バッファはいっぱいになります。 – atturri

+0

読み込む前にどの配列のサイズを宣言しなければならないのですか? – lockdoc

関連する問題