Я пытаюсь выполнить 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.
Вам действительно нужно использовать execvp? Возможно, попробуйте использовать system(). –
Кроме того, попробуйте поставить «grep» в качестве первого arg в вашем args_list. –
Оба работают отлично. Это упражнение при использовании exec(), вот и все. Но спасибо, что указали, что было прямо под моим носом! – Cody