пример того, что программа должна делать:Недопустимые аргументы для вызова функции execv
./executable ls -l
должны делать то же самое, как
ls -l
так в основном это бесполезно интерпретатор команд оболочки.
Я создал строку, содержащую fullpath
/bin/commandname
и двумерный массив arguments
, которая в основном argv
, но без первых двух записей (которые executable
и commandname
).
Для ./executable ls -l
примера он фактически возвращает следующее:
full path: /bin/ls
Argument 0: -l
, который является правильным, но execv
не делает буквально ничего.
Как исправить это?
#include <stdio.h>
#include <unistd.h>
#include <string.h>
#include <stdlib.h>
int main(int argc, char** argv){
char path[6] = "/bin/";
char* fullpath = (char*)malloc(strlen(path)+strlen(argv[1]));
strcat(fullpath, path);
strcat(fullpath, argv[1]);
printf("full path: %s\n", fullpath);
char *arguments[argc-1];
int i;
for(i=0; i<argc-2; i++){
arguments[i] = (char*)malloc(strlen(argv[i+2]));
strcpy(arguments[i], argv[i+2]);
printf("Argument %d: %s\n", i, argv[i+2]);
}
execv("/bin/ls", arguments);
return 0;
}
Но что, если есть не один аргумент? –
Вы получаете свою команду, следуя своим опциям, не так ли? Argv - переменная с типом char **; и вам понадобится char ** для сохранения параметров команды. –
Если argv [1] - ваша команда, и если остальные параметры являются параметрами команды; вы можете изменить адрес, указанный argv, для получения только того, что вы хотите принять. В моем примере вам нужно: argv = argv + 2; С помощью этой модификации указатель argv должен указывать на ваш первый вариант. char ** argv уже содержит значение «NULL» в конце массива; поэтому вы можете отправить argv в execve как опции. Это очевидно, но если вы хотите получить доступ к команде (argv [1] в начале), вы можете изменить адрес, указанный argv: argv = argv - 1; –