2012-05-03 42 views
1

我想exec()调用grep在我的C程序里面。我要寻找一个在给定文件中指定串模式的出现次数,可以用以下方式实现:如何使用execvp()和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调用输出文件名和数字。

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

编辑:

解决方案:包括在参数列表中的程序名,或简单地使用系统()调用。另外,RTFM。

+2

你真的需要使用execvp吗?也许尝试使用system()。 –

+4

另外,请尝试将“grep”作为args_list中的第一个参数。 –

+0

两者都可以很好地工作。这是使用exec()的一个练习,就是这样。但是谢谢你指出我鼻子下面的东西! – Cody

回答

3

你有两个问题(插入JWZ报价约在这里正则表达式):

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

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