c - 如何将 execvp() 与 grep 一起使用?

标签 c grep exec execvp

我正在尝试在我的 C 程序中 exec() 调用 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。

最佳答案

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

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

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

关于c - 如何将 execvp() 与 grep 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10438445/

相关文章:

regex - 找到具有至少两次重复模式的线条?

php - 在特定时间后在 php 中终止函数?

C - 高效编码字符串生成算法

我可以使用 pthread_cond_wait(,) 同时向多个线程发出信号吗?

c - "invalid use of void expression"

c - 如果没有为 printf 提供格式说明符,会发生什么情况?

emacs - 在 Emacs 中是否可以克隆 *grep* 或 *compile* 缓冲区并保留搜索/选择功能?

shell - 将变量从 shell 脚本导出到 awk

c - 如何在 c 中结束重定向的 execlp

c++ - Win32 C API : Alternative to broken execl*() family of functions?