2012-05-03 43 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"。該字符串是一個空字符串,但它不是空指針。