【问题标题】:Passing parameters a a string to execvp将参数a传递给execvp
【发布时间】:2018-05-15 00:37:28
【问题描述】:

我有以下代码:

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的参数我似乎无法运行程序,我做错了什么?

【问题讨论】:

  • execvp(arg[0], arg + 1); 应该可以解决问题。
  • 你为什么要strcat(s2, s1);?最好在问题中添加以下详细信息 - 1. 传递给该程序的命令行参数。 2.解释a=9.

标签: c parameters parameter-passing exec


【解决方案1】:

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-09-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多