Простите за отклонение от рассматриваемого вопроса в моем предыдущем ответе (предлагая использовать темы).Так как я иду в совершенно новом направлении, я вынужден добавить это как отдельный ответ.
Короткая версия:
Пожалуйста, сделайтеследующие изменения в вашей программе:
1. length = argc; // in place of length = sizeof(argv);
2. execl(argv[i],argv[i],0); // in place of execvp(argv[i],0);
3. #include <unistd.h> // if you haven't already
Длинная версия:
(1) По переменной length
, я полагаю, вы хотитечтобы получить общее количество аргументов.argv
- это pointer-to-char-pointer
, и как таковой это просто адрес памяти.Если вы распечатаете длину в вашей программе, вы заметите, что она всегда равна 4 (или каков бы ни был размер адреса памяти в вашей системе).
Итак, это:
length = sizeof(argv);
В действительности должно быть так:
length = argc;
argc
содержит общее количество аргументов, переданных при выполнении процесса.Например,
./a.out /bin/ps /bin/ls
дает: argc = 3 (а не 2 , очень распространенная ошибка)
(2) Другая проблема с вашей программой, это вызов execvp
.
Прототип для execvp выглядит следующим образом:
int execvp(const char *file, char *const argv[]);
где, argv - список переданных аргументовновой команде, очень похожей на argv в вашей собственной программе.
В вашей программе вы используете:
execvp(argv[i],0);
Предположим, i=1
и argv[1] = "/bin/ls"
.Эта команда ищет исполняемый файл /bin/ls
и передает ему нулевой указатель (0
).Это может привести к следующей ошибке во время выполнения:
A NULL argv[0] was passed through an exec system call.
Ссылаясь на страницу руководства exec,
Первый аргумент, по соглашению, должен указывать на имя файла, связанное с файломвыполняется.
Хотя повторение имени файла не обязательно, вы, конечно, не должны передавать указатель NULL.Поскольку вы не хотите передавать какие-либо аргументы, я предлагаю вместо этого использовать следующий вызов execl
:
execl(argv[i],argv[i],0);
Помните, что все такие вызовы в конечном итоге преобразуются в execve()
окончательно и затем выполняются,делая их эквивалентными в конце концов.
Я рекомендую вам прочитать больше о семействе функций exec , используя man
.