2

我正在尝试 exec() 在我的 C 程序中调用 grep 。我正在寻找给定文件中字符串模式的出现次数,这可以通过以下方式实现:

$ 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

有两个问题。首先,我只想要数字——而不是找到它的文件。其次,我不确定为什么它试图断言 -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

您有两个问题(在此处插入关于正则表达式的 JWZ 引用):

  1. 传递的数组中的第一个参数exec被传递argv[0]给新的可执行文件。通常,这是可执行文件的名称,程序使用它来确定自己的名称。所以你告诉 grep 它的名字是-e,它的参数是my_string -F my_file.txt -c ""。它没有-e像您期望的那样得到论点,因此它误解了它的论点并给您一个错误。

  2. 您没有正确地将参数数组以 NULL 结尾exec。最后一个参数必须是文字NULL,而不是字符串"\0"。该字符串是一个空字符串,但它不是空指针。

于 2012-05-03T20:13:25.010 回答