2012-05-03 16 views
1

私のCプログラムの中でgrepへの呼び出しをexec()しようとしています。しかしgrepでexecvp()を使用するには?

5 

、次のような予想通りの数の出力を与える

$ grep -e my_string -F my_file.txt -c 

、:私は達成することができ、特定のファイル内の文字列パターンの出現回数を探しています私が同等であることを望んだことは、いくつかの困難を抱えているようです。次のコード:中

char *arg_list[] = {"-e", "my_string", "-F", "my_file.txt", "-c", "\0"}; 

int pid; 
if ((pid = fork()) == 0) { 
    if (execvp("grep", arg_list) < 0) 
     perror("execvp"); 
} 

結果:

my_file.txt:5 
-e: : No such file or directory 

二つの問題があります。まず、番号が必要です。見つかったファイルではありません。次に、-eフラグがファイルである必要があると主張しようとしている理由がわかりません。私がする引数リストの周りに切り替える場合:

char *arg_list[] = {"-F", "my_file.txt", "-e", "my_string", "-c", "\0"}; 

それから私は戻って取得:

my_file.txt:5 
-F: : No such file or directory 

私はなぜこれが起こっているを探して開始する場所がわからないんだけど。私はまた、なぜコマンドラインからのgrep呼び出しの出力が数字であるのか分からないが、exec()のgrep呼び出しはファイル名と番号の両方を出力する。

助けていただけたら幸いです!ありがとうございました。

EDIT:

ソリューション:引数リストにプログラム名を含め、または単にシステム()の呼び出しを使用しています。また、RTFM。あなたは二つの問題(ここでは正規表現についてJWZの引用を挿入)している

+2

本当にexecvpを使用する必要がありますか?たぶんsystem()を使ってみてください。 –

+4

また、args_listの最初のargとして "grep"を入れてみてください。 –

+0

どちらも完璧に動作します。これはexec()を使用するエクササイズです。しかし、私の鼻の下に何があったのかを指摘してくれてありがとう! – Cody

答えて

3

  1. 配列の最初の引数がexecを通過したが、新しい実行可能ファイルへargv[0]として渡されます。通常、これは実行可能ファイルの名前であり、プログラムが自分の名前を理解するために使用するものです。だからgrepにその名前は-eで、引数はmy_string -F my_file.txt -c ""です。期待通りに-e引数を取得できないため、引数を誤解してエラーが発生します。

  2. 引数の配列をNULL終了して正しく入力していません。execです。最後の引数は文字列"\0"ではなく、NULLのリテラルでなければなりません。その文字列は空文字列ですが、NULLポインタではありません。

関連する問題