我正在尝试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。
答案 0 :(得分:3)
你有两个问题(在这里插入关于正则表达式的JWZ引用):
传递给exec
的数组中的第一个参数作为argv[0]
传递给新的可执行文件。通常,这是可执行文件的名称,它是程序用来计算自己名字的名称。所以你告诉grep它的名字是-e
,它的参数是my_string -F my_file.txt -c ""
。它没有像你期望的那样得到-e
参数,所以它误解了它的参数并给你一个错误。
你没有正确地将{ - 1}}的参数数组终止。最后一个参数必须是文字exec
,而不是字符串NULL
。该字符串是一个空字符串,但它不是空指针。