Per execv()
Linux man-страница :
v - execv (), execvp (), execvpe ()
Char * const argv [] аргумент - это массив указателей на строки с нулевым символом в конце, которые представляют список аргументов, доступный для новой программы. Первый аргумент, по соглашению, должен указывать на имя файла, связанное с исполняемым файлом. Массив указателей должен заканчиваться нулевым указателем.
Вам необходимо изменить
char *argv[] = { "-n", "include", "ques29.c", "NULL" };
execv("/usr/bin/grep", argv);
на
char *argv[] = { "/usr/bin/grep", "-n", "include", "ques29.c", NULL };
execv(argv[0], argv);
И, как отмечено в комментариях обработка неудавшегося вызова на exec*()
, вероятно, должна быть выполнена:
execv(argv[0], argv);
// no need to check the return value as
// a successful call won't return
perror( "execv()" );
// note that return and exit() can cause
// problems with more complex code
_exit( 255 );