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.