Que fait execvp?

Dupliquer possible:
Écrire un shell – comment exécuter des commandes

J’ai été chargé d’écrire un shell en C. Jusqu’ici, je comprends que execvp va essayer d’exécuter le programme en arg1 avec arg2 comme parameters. Maintenant, il semble que cela

execvp ("ls", args); //assume args is {"ls", ">", "awd.txt"} 

n’est pas équivalent à taper ceci dans la console

 ls > awd.txt 

Je réalise que je dois utiliser freopen pour obtenir les mêmes résultats, mais je suis curieux de savoir ce que execvp fait.

La famille de fonctions exec est finalement un appel système. Les appels système vont directement au kernel et exécutent généralement un service très spécifique que seul le kernel peut effectuer.

La redirection, par contre, est une fonctionnalité du shell.

Donc, quand on tape ls > awd.txt dans un shell, le shell fait d’abord un fork(2) , puis ferme la sortie standard dans l’enfant, puis ouvre awd.txt sur le descripteur de fichier 1 de sorte qu’il s’agisse de la nouvelle sortie standard .

Alors, et seulement alors, le shell fera un appel système exécutif.

Dans votre cas, vous avez simplement passé les chaînes > et awd.txt à l’appel système exec, puis à ls . BTW, assurez-vous de terminer votre tableau arg execvp avec un pointeur null.


Remarque: Comme vous pouvez le constater, les opérateurs de redirection ne sont jamais vus par le programme exécuté. Avant Unix, chaque programme basé sur une option devait diriger la sortie vers un fichier. Plus sortingvia: la plupart des programmes ne savent jamais qu’ils ont été redirigés, mais ironiquement, ls vérifie si sa sortie est un tty, et si c’est le cas, il effectue la sortie multi-colonnes au format.

Il exécute ls avec 2 arguments: > et awd.txt . Cela équivaut à courir:

 'ls' '>' 'awd.txt' 

Vous pouvez passer votre commande directement au shell:

 char * const args[] = { "sh", "-c", "ls > awd.txt", NULL}; execvp("/bin/sh", args); 

Mais cela ne semble pas être une bonne idée.