我正在尝试在我的 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 引用):
传递给
exec
的数组中的第一个参数作为argv[0]
传递给新的可执行文件。通常,这是可执行文件的名称,程序用它来确定自己的名称。因此,您告诉 grep 它的名称是-e
,其参数是my_string -F my_file.txt -c ""
。它没有像您期望的那样获得-e
参数,因此它会误解其参数并给您一个错误。您没有正确地以 NULL 终止
exec
的参数数组。最后一个参数必须是文字NULL
,而不是字符串"\0"
。该字符串是一个空字符串,但它不是一个空指针。
关于c - 如何将 execvp() 与 grep 一起使用?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10438445/