à l'aide d'un nouveau chemin avec execve pour exécuter commande ls
Je suis en train d'utiliser execve pour exécuter la commande ls. Actuellement, je suis en cours d'exécution avec les arguments suivants:
execve(args[0], args, env_args)
//args looks like {"ls", "-l", "-a", NULL}
//env_args looks like {"PATH=/bin", "USER=me", NULL}
Ce que j'attendais de ce faire est d'exécuter la commande ls à l'aide de mon nouveau env_args signification qu'il allait chercher des ls dans mon CHEMIN. Toutefois, ce code ne fait pas tout faire, et quand je lance le code, il retourne à mon invite de commande sans sortie.
À l'aide de la même args[] j'ai été en utilisant execvp et ls travaillé et cherché mon chemin.
Pouvez-vous me dire ce que je fais de mal?
Ce que j'essaie de faire est d'écrire mon propre programme de shell où je peux créer et exporter mon propre environnement, et ont exec utilisation de l'environnement que j'ai défini dans un char**. Essentiellement, je suis en train d'écrire mon propre pour fonctionner sur env_args pour ajouter et supprimer des vars et quand j'ai appeler exec je veux être en mesure d'appeler exec sur {"ls", "-l", NULL} et l'ai regarde en bas de mes nouveaux environnements variable de chemin d'accès valide pour un programme appelé ls. J'espère que c'est ce qui explique que je suis en train de faire un peu mieux. Je ne pense pas que la extern environ var de travail pour moi dans ce cas.
Vous devez vous connecter pour publier un commentaire.
execve()
ne regarde pas le CHEMIN; pour cela, vous devezexecvp()
. Votre programme ne s'exécutels
, et apparemment, vous n'avez pas de rapport d'échecs pour exécuter un programme après l'execve()
. Veuillez noter que les membres de laexec*()
famille de fonctions de retour en cas d'erreur.Vous obtiendrez le résultat que vous attendiez (plus ou moins) si vous avez exécuté le programme avec
/bin
que votre répertoire courant (parce que./ls
- akals
- il).Vous devez fournir le chemin d'accès de l'exécutable dans le premier argument de
execve()
, après la trouver en utilisant le paramètre de CHEMIN.Ou continuer à utiliser
execvp()
, mais de définir la variableenviron
à votre nouvel environnement. Notez queenviron
est maintenant POSIX (2008) a déclaré dans<unistd.h>
, mais auparavant n'a pas été déclaré, n'importe où.Vous n'avez pas besoin d'enregistrer l'ancienne valeur et de restauration; vous êtes dans le processus de l'enfant de commutation et de son environnement n'affecte pas le programme principal (shell).
Cela semble fonctionner comme je l'avais espérer - et démontre que le code d'origine se comporte comme je l'avais espérer.
- Je obtenir un " Oups!", suivi par l'inscription de mon répertoire. Quand j'ai créer un fichier exécutable
ls
dans mon répertoire courant:alors je ne comprends pas le "Oups!" et ne se le " Haha!'.
ls
trouvent sur votre ordinateur?