Простите меня за то, что я отвлекся от вопроса в своем предыдущем ответе (предлагая использование потоков). Поскольку я собираюсь начать совершенно новое направление, я вынужден добавить это как отдельный ответ.
Короткая версия:
Пожалуйста, сделайте следующие изменения в программе:
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 = (а не , очень распространенная ошибка)
(2) Еще одна проблема с вашей программой, является execvp
вызов.
prototpye для execvp выглядит следующим образом:
int execvp(const char *file, char *const argv[]);
где ARGV список аргументов, переданных в новую команду, очень похожий на ARGV в вашей собственной программе.
Что вы используете в вашей программе является:
execvp(argv[i],0);
Пусть i=1
и argv[1] = "/bin/ls"
. Что это за команда, так это поиск /bin/ls
исполняемого файла & передать указатель NULL (0
). Это может привести к следующей ошибке во время выполнения:
A NULL argv[0] was passed through an exec system call.
Ссылаясь на ехес страницы человека,
The first argument, by convention, should point to the filename associated with the file being executed.
Хотя это не обязательно, чтобы передать имя файла еще раз, вы, конечно, не должен передавать указатель NULL , Так как вы не хотите, чтобы передать какие-либо аргументы, я предлагаю вам использовать следующий execl
вызов, вместо:
execl(argv[i],argv[i],0);
Помните, что все такие звонки, наконец, преобразуются в execve()
наконец & затем выполняется, что делает их эквивалент в конце концов.
Я рекомендую вам узнать больше о семействе функций exec, используя man
.
У вас нет вызова 'fork()' в вашей примерной программе. Это намеренно? – sth
Отрицательный, просто забыл включить его. – mispecialist
, если wait() находится внутри цикла, он будет последовательно выполнять аргументы. Я думаю, что то, что вы хотите сделать, - это ждать, когда цикл запустит все процессы, выполняющие свою работу. –