2

C プログラム内で grep の呼び出しを exec() しようとしています。特定のファイル内の文字列パターンの出現回数を探しています。これは次の方法で実現できます。

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

次のように、期待どおりの数値出力が得られます。

5

しかし、私が同等であることを望んでいたことは、いくつかの問題を抱えているようです。次のコード:

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

2 つの問題があります。まず、番号が必要なだけです。それが見つかったファイルではありません。次に、-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 呼び出しはファイル名と数字の両方を出力します。

どんな助けでも大歓迎です!ありがとうございました。

編集:

解決策: 引数リストにプログラム名を含めるか、単に system() 呼び出しを使用します。また、RTFM.

4

1 に答える 1

3

2 つの問題があります (ここに正規表現に関する JWZ の引用を挿入してください)。

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

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

于 2012-05-03T20:13:25.010 に答える