2017-03-23 2 views
0

J'essaye de faire un programme d'interface de ligne de commande qui peut obtenir la ligne de code de l'entrée d'utilisateur et les exécute using execlp.Un moyen plus efficace que: execlp (cmd [0], cmd [0], cmd [1] cmd [2], cmd [3] NULL);

Je veux savoir s'il y a une meilleure façon d'écrire mon code.

execlp(cmd[0], cmd[0], cmd[1] cmd[2], cmd[3] NULL); 
perror("Execlp"); 

Par exemple utilisateur d'entrer 4 mots et chacun d'entre eux seront stockées dans:

cmd[0] cmd[1] cmd[2] cmd[3] 

si nous utilisons la compilation fonction qui est cc helloworld.c -o helloworld cela nécessitera 4 l'espace intérieur tableau cmd[]

ou nous utilisons ./helloworld

il sera stocker dans cmd[0] et ru Mais, je suppose que s'il y a une fonction qui nécessite plus de 4 mots, mon programme pourra-t-il les exécuter? La réponse est probablement pas, par exemple: s'il y a est 5 ou plusieurs mots, je ne pense pas que mon programme sera en mesure de fonctionner à moins que dans ma fonction, il aura élément 5 travailler

execlp(cmd[0], cmd[0], cmd[1] cmd[2], cmd[3]. cmd[4], NULL); 

ou

execlp(cmd[0], cmd[0], cmd[1] cmd[2], cmd[3], cmd[4], cmd[5], cmd[6], NULL); 
perror("Execlp"); 

Existe-t-il un moyen plus efficace de le faire? en utilisant d'autres fonctions dans la famille exec().

Merci :)

+1

pourquoi ne pas utiliser 'int execvp (const char * fichier, char * const argv [])'? – pynexj

+0

Hmm je l'utilise avant, mais je ne pense pas vraiment les comprendre, je vais poster un code sous peu, j'ai essayé de les utiliser et quand je l'utilise, il ne peut accepter qu'un certain nombre de valeur ... – markh

+0

'((char * args [] = {cmd [0], cmd [1], NULL}; execvp (cmd [0], args); perror ("Execp");)' ce code uniquement travailler avec une fonction qui nécessite deux mots, par exemple 'cc hw.c';' rm hw.c'; si j'essaie 'cc hw.c -o hw' qui est de 4 mots ça ne marchera pas – markh

Répondre

2

Qu'en est-il en utilisant execvp()? E.g .:

[STEP 110] # cat execvp.c 
#include <unistd.h> 

int 
main(int argc, char *argv[]) 
{ 
    /* argv[argc] is always NULL */ 
    execvp(argv[1], &argv[1]); 
    return 0; 
} 
[STEP 111] # gcc -Wall execvp.c 
[STEP 112] # ./a.out echo 1 
1 
[STEP 113] # ./a.out echo 1 2 
1 2 
[STEP 114] # ./a.out echo 1 2 3 
1 2 3 
[STEP 115] # 
+0

Je savais qu'il y a un meilleur Résolvez ma curiosité! Pouvez-vous également expliquer comment ce travail, et j'ai testé s'il n'y a pas d'argc int dans la fonction (int argc, char * cmd []), il fonctionnera toujours comme il se doit. – markh

+0

s'il vous plaît se référer à la page man execvp pour plus de détails, mon anglais n'est pas comme aller od. pour "int argc", ce n'est pas une erreur de ne pas utiliser l'argument d'une fonction. – pynexj