Execvp没有执行args

时间:2018-02-20 18:58:25

标签: c execvp

我无法获得执行args的execvp,只有当我将args的数量设置为0时,此代码才有效。我一直在尝试在这里和那里更换行2小时并检查其他类似的问题,但没有什么是工作,也许有人有个主意?

void executeProgram()
{
    char *argv[20];
    printf("Please enter command or program name:");
    char *commande;
    scanf("%s", commande);
    argv[0] = malloc(100);
    argv[0] = commande;
    int nbArgZ = -1;
    while(nbArgZ < 0){
            printf("Please enter number of arguments:");
            scanf("%d", &nbArgZ);
    }
    int x;
    int y =1;
    for(x = 1; x < nbArgZ+1; x++){
            char *tempo;
            argv[x] = malloc(100);
            printf("Argument %d : ", x);
            scanf("%s", tempo);
            argv[x] = tempo;
            y++;
    }
    argv[y] = NULL;
    int pid = fork();
    if ( pid == 0 ) {
            execvp(argv[0], argv);
    }
    wait(2);
    printf( "End of execution\n");
}

2 个答案:

答案 0 :(得分:2)

您有多个问题。以下是其中几个:

argv[x] = malloc(100);
...
argv[x] = tempo;

首先,让argv[x]指向您分配的内存,然后将argv[x]指向tempo所指向的位置,使您丢失原始内存。

关于tempo

char *tempo;
...
scanf("%s", tempo);

你有一个未初始化的指针。指向的地方是不确定并且看起来几乎是随机的。取消引用此指针(当您调用scanf时会发生这种情况)会导致未定义的行为

argv[x]直接传递到您的scanf电话可以解决这两个问题:

scanf("%99s", argv[x]);  // No more than 99 characters (excluding terminator)

你有同样的问题不是一次,但两次

答案 1 :(得分:1)

此代码

   argv[0] = malloc(100);
    argv[0] = commande;

应立即引爆警钟。你分配东西tog argv [0],然后在下一行中将它设置为其他东西。那不可能是正确的

你需要

char commande[100]; // we will assume 100 is enough
scanf("%s", commande);
argv[0] = strdup(commande); // strdup maybe not needed, buts lets be safe

和arg循环中的相同更改