Передача параметров в строку в execvp - PullRequest
0 голосов
/ 15 мая 2018

У меня есть следующий код:

int main(int argc, char *argv[])
    {
        int i, a=9;
        int length = 0;
        const char fail[20] = "Missing Arguments\n";
        char s1[512] = "";
        char s2[15] = "./calc_prizes";

        for (i=1; i<argc; i++) {
            length += sprintf(s1+length, " %s", argv[i]);
        }
        strcat(s2, s1);


        while(++a < argc) {
            if(fork() == 0) {
                char* arg[] = {s2, s1, NULL};   //this is the part that's wrong
                execvp(arg[0],arg);
                exit(1);
            }
            else
                wait(NULL);
        }   
        return 0;
    }   

S2 хранит название программы, s1 параметры собирает параметры. Кажется, я не могу запустить программу с параметрами с помощью execvp, что я делаю не так?

1 Ответ

0 голосов
/ 15 мая 2018

Одной из возможных причин сбоя execvp может быть:

strcat(s2, s1);

[ Надеюсь, вы убедились, что s2 достаточно большой, чтобы содержать объединенную результирующую строку, в противном случае переполнение буфера, что является другой, но, безусловно, проблемой в вашем коде. ]
Здесь вы объединяете от s1 до s2, а s2 - это имя программы, которую вы хотите выполнить. В цикле while вы делаете:

char* arg[] = {s2, s1, NULL};

arg[0] указывает на s2 (объединенная строка), и вы передаете это в качестве первого аргумента execvp:

execvp(arg[0],arg);

execvp

Функции execv (), execvp () и execvpe () предоставляют массив указателей на строки с нулевым символом в конце, которые представляют список аргументов, доступных для новой программы. Первый аргумент, по соглашению, должен указывать на имя файла, связанное с исполняемым файлом. Массив указателей должен заканчиваться указателем NULL. [ Акцент мой ]

Следовательно, для успешного вызова execvp в качестве имени исполняемого файла в качестве имени исполняемого файла должен быть указан первый аргумент ./calc_prizes.

...