如何在grep中使用execvp()?

时间:2012-05-03 19:56:18

标签: c grep exec execvp

我正在尝试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()'d grep调用输出文件名和数字。

任何帮助将不胜感激!谢谢。

编辑:

解决方案:在参数列表中包含程序名称,或者只使用system()调用。此外,RTFM。

1 个答案:

答案 0 :(得分:3)

你有两个问题(在这里插入关于正则表达式的JWZ引用):

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

  2. 你没有正确地将{ - 1}}的参数数组终止。最后一个参数必须是文字exec,而不是字符串NULL。该字符串是一个空字符串,但它不是空指针。