Execvp 不执行参数
Execvp not executing args
我无法让 execvp 执行 args,此代码仅在我将 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");
}
您有多个个问题。这是其中的几个:
argv[x] = malloc(100);
...
argv[x] = tempo;
首先你让argv[x]
指向你分配的一些内存,然后你让argv[x]
指向tempo
指向的地方,这样你就失去了原来的内存。
关于tempo
:
char *tempo;
...
scanf("%s", tempo);
您有一个未初始化的指针。它指向的位置是 indeterminate 并且看起来几乎是随机的。当您调用 scanf
时取消引用此指针会导致 未定义的行为 。
这两个问题都可以通过将 argv[x]
直接传递给您的 scanf
调用来解决:
scanf("%99s", argv[x]); // No more than 99 characters (excluding terminator)
你遇到同样的问题不止一次,而是两次。
此代码
argv[0] = malloc(100);
argv[0] = commande;
应该立即敲响警钟。您将一些东西分配给 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 循环中的相同更改
我无法让 execvp 执行 args,此代码仅在我将 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");
}
您有多个个问题。这是其中的几个:
argv[x] = malloc(100);
...
argv[x] = tempo;
首先你让argv[x]
指向你分配的一些内存,然后你让argv[x]
指向tempo
指向的地方,这样你就失去了原来的内存。
关于tempo
:
char *tempo;
...
scanf("%s", tempo);
您有一个未初始化的指针。它指向的位置是 indeterminate 并且看起来几乎是随机的。当您调用 scanf
时取消引用此指针会导致 未定义的行为 。
这两个问题都可以通过将 argv[x]
直接传递给您的 scanf
调用来解决:
scanf("%99s", argv[x]); // No more than 99 characters (excluding terminator)
你遇到同样的问题不止一次,而是两次。
此代码
argv[0] = malloc(100);
argv[0] = commande;
应该立即敲响警钟。您将一些东西分配给 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 循环中的相同更改