2012-05-03 1 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-вызова из командной строки - это просто число, но вызов grep exec() 'd выводит как имя файла, так и номер.

Любая помощь будет оценена! Спасибо.

EDIT:

Решение включает имя программы в списке аргументов, или просто использовать вызов системы(). Кроме того, RTFM.

+2

Вам действительно нужно использовать execvp? Возможно, попробуйте использовать system(). –

+4

Кроме того, попробуйте поставить «grep» в качестве первого arg в вашем args_list. –

+0

Оба работают отлично. Это упражнение при использовании exec(), вот и все. Но спасибо, что указали, что было прямо под моим носом! – Cody

ответ

3

У вас есть две проблемы (вставка JWZ цитаты о регулярных выражениях здесь):

  1. Первый аргумент в массиве передается exec получает переданные в качестве argv[0] к новым исполняемым. Обычно это имя исполняемого файла, и это то, что программы используют для определения своего имени. Поэтому вы сообщаете grep, что его имя -e, и его аргументы my_string -F my_file.txt -c "". Он не получает аргумент -e, как вы могли ожидать, поэтому он неправильно истолковывает свои аргументы и дает вам ошибку.

  2. Вы не являетесь должным образом NULL-завершаете массив аргументов до exec. Последний аргумент должен быть литералом NULL, а не строкой "\0". Эта строка является пустой строкой, но она не является нулевым указателем.