2015-09-17 1 views
2

J'ai écrit un programme de test pour essayer de comprendre comment utiliser execvp(), mais je continue de rencontrer un problème. La partie pertinente de mon code est:comment utiliser execvp - trouver l'argument du fichier

... 
printf("execute: 'ls -a'\n"); 
char *args[2]; 
args[0] = "/bin/ls"; 
args[1] = "ls"; 
args[2] = "-a"; 
... 
} else if(pid == 0){ //child process 
    if(execvp(*args, args) < 0) { //execute command 
     fprintf(stderr, "Error: execution failed\n"); 
     exit(1); 
    } 
} 
... 

Chaque fois que je cours, je reçois une erreur «/bin/ls: ne peut pas accéder à ls: Aucun fichier ou répertoire ». which ls me dit/bin/ls donc je ne comprends pas ce que je fais mal. Est-ce parce que le fichier exécutable ne se trouve pas dans mon répertoire personnel mais plutôt dans un fichier de projet?

Répondre

3

Quelques question ici:

args est défini comme un ensemble d'éléments 2, mais vous mettez en 3 éléments, de sorte que vous écrivez après la fin du tableau.

Le tableau args doit avoir un pointeur NULL comme dernier élément, sinon execvp ne saura pas quand il atteint la fin de la liste d'arguments.

Le premier élément dans args devrait être le nom du programme (c'est ce qui apparaît dans une liste ps), et les éléments suivants devraient être les arguments. La façon dont il est maintenant, vous avez ls comme deuxième élément dans le tableau, ce qui signifie qu'il est le premier argument de la commande /bin/ls. La commande ls essaie donc de trouver le fichier nommé ls dans le répertoire en cours mais ne le peut pas. Ceci explique le message d'erreur que vous obtenez.

Avec les correctifs appliqués:

... 
printf("execute: 'ls -a'\n"); 
char *args[3]; 
char *path = "/bin/ls"; 
args[0] = "ls"; 
args[1] = "-a"; 
args[2] = NULL; 
... 
} else if(pid == 0){ //child process 
    if(execvp(path, args) < 0) { //execute command 
     fprintf(stderr, "Error: execution failed\n"); 
     exit(1); 
    } 
} 
+0

Bonne et bonne réponse, mais je devais le lire quelques fois avant que je prenne votre distinction entre le "premier élément" de "args" et le "premier argument" à la commande exécutée. –

+0

@JohnBollinger Merci, j'ai apporté quelques éclaircissements. – dbush

1

Je pense vraiment que le code est

char *args[3]; 
args[0] = "/bin/ls"; 
args[1] = "-a"; 
args[2] = NULL; 

Than

char *args[2]; 
args[0] = "/bin/ls"; 
args[1] = "ls"; 
args[2] = "-a";