将参数传递给execvp

时间:2018-05-15 00:37:29

标签: c parameters parameter-passing exec

我有以下代码:

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 :(得分:0)

execvp失败的一个可能原因可能是:

strcat(s2, s1);

[我希望你已经确保s2足够大以包含连接的结果字符串,否则它的缓冲区溢出,这在你的代码中是一个不同但肯定是个问题。] <登记/> 在这里,您将s1连接到s2s2是您要执行的程序的名称。在while循环中,您正在执行:

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

arg[0]指向s2(连接字符串),并且您将此作为execvp的第一个参数传递:

execvp(arg[0],arg);

execvp

  

execv(),execvp()和execvpe()函数提供了一个指向以null结尾的字符串的指针数组,这些字符串表示新程序可用的参数列表。 按照惯例,第一个参数应指向与正在执行的文件关联的文件名。指针数组必须以NULL指针终止。 [强调我的]

因此,要成功调用execvp,您应该将第一个参数作为可执行文件的名称,在您的情况下为./calc_prizes