Reputation: 327
I can't get execvp to execute the args, this code only works if I set the number of args to 0. I've been trying to change lines here and there for 2 hours and checking other similar questions but nothing is working, maybe someone got an idea?
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");
}
Upvotes: 0
Views: 322
Reputation: 50180
this code
argv[0] = malloc(100);
argv[0] = commande;
should set off alarm bells immediately. You assign something toe argv[0], then in the next line set it to something else. That cannot be correct
you need
char commande[100]; // we will assume 100 is enough
scanf("%s", commande);
argv[0] = strdup(commande); // strdup maybe not needed, buts lets be safe
and the same change inside your arg loop
Upvotes: 1
Reputation: 409176
You have multiple problems. Here are a couple of them:
argv[x] = malloc(100);
...
argv[x] = tempo;
First you make argv[x]
point to some memory you allocate, then you make argv[x]
point to where tempo
is pointing, making you lose the original memory.
And about tempo
:
char *tempo;
...
scanf("%s", tempo);
You have an uninitialized pointer. Where it is pointing is indeterminate and will seem almost random. Dereferencing this pointer, which happens when you call scanf
, leads to undefined behavior.
Both of these issue can be solved by passing argv[x]
directly to your scanf
call:
scanf("%99s", argv[x]); // No more than 99 characters (excluding terminator)
And you have the very same problem not once, but twice.
Upvotes: 2