2015-04-05 3 views
0

пример того, что программа должна делать:Недопустимые аргументы для вызова функции 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; 
} 

ответ

2

Ваша программа кажется функциональным, когда мы изменяем следующую строку:

char *arguments[argc-1]; 

Ваш символьные ** аргументы должны быть как строки:

char *arguments[] = { "/bin/ls", "-l", NULL };

Другими словами, не забудьте указать команду сначала; и обязательно поставьте NULL в конце вашего символа **.

Удачи вам! ;)

+0

Но что, если есть не один аргумент? –

+0

Вы получаете свою команду, следуя своим опциям, не так ли? Argv - переменная с типом char **; и вам понадобится char ** для сохранения параметров команды. –

+0

Если argv [1] - ваша команда, и если остальные параметры являются параметрами команды; вы можете изменить адрес, указанный argv, для получения только того, что вы хотите принять. В моем примере вам нужно: argv = argv + 2; С помощью этой модификации указатель argv должен указывать на ваш первый вариант. char ** argv уже содержит значение «NULL» в конце массива; поэтому вы можете отправить argv в execve как опции. Это очевидно, но если вы хотите получить доступ к команде (argv [1] в начале), вы можете изменить адрес, указанный argv: argv = argv - 1; –

Смежные вопросы