2011-03-12 10 views
4

シェルコマンドを引数として使用する関数を作成しようとしていますが、forkを使用してコマンドを実行する新しいプロセスを生成します。また、関数の呼び出し側がFILE *ポインターを使用してその関数を読み取ることができるように、コマンドの標準出力をリダイレクトする必要もあります。シェルコマンドを実行し、その出力をCプログラムで読み取る

static FILE* runCommand(char* command){ 
    int pfd[2]; 

    if(pipe(pfd)<0)  
     return NULL; 

    if(pid=fork()==0){ //child 
     close(pfd[0]); 
     dup2(pfd[1],1); //redirect output to pipe for writing 

     execlp(command,(char*)0); 
    } 

    close(pfd[1]); 

    //return a file pointer/descriptor here? 

}

私はコマンドの出力を読み取るために使用できるファイルポインタを返す方法を確認していません。また、シェル上でコマンドを実行する正しい方法はありますか?

ps。私はpopenについて読んだが、私はそれを使うことができないほどの理由があるので、私はこの機能を自分で実装しなければならない。

FILE *オブジェクトを持つ既存のファイルディスクリプタを関連付けるためにfdopenを使用し

+0

popenがmallocを呼び出しているようです(mallocをオーバーライドした原因がわかります)、それはプロジェクトのために複雑になります。だから私はpopenを呼ぶことを好まないのです。 – SpotsWood

答えて

4

このコードのバグは、どこでも宣言されていない変数pidに割り当てることです。書かれたコードは(pid=fork())==0ではなくpid=(fork()==0)と等価であるため、pidは常に親で1になります。

また、dup2呼び出し後にpfd [1]を閉じる必要があります。そして、適切な対策のために、dup2とexeclpからエラーをチェックしてください。

実際の質問に対する回答はfdopenです。

1

ありがとうございます。他のすべてはかなり良いように見えます。

関連する問題