À l'aide de la famille exec() pour exécuter la commande “cd”
Je sais que cd
est un environnement intégré ,et je peux l'exécuter en utilisant system()
.
Mais est-ce possible d'exécuter la cd
commande par le exec()
de la famille, comme execvp()
?
Edit: Et je viens de remarquer que system("cd")
est aussi vide de sens。Merci pour l'aide de tout le monde.
OriginalL'auteur goofy | 2012-03-25
Vous devez vous connecter pour publier un commentaire.
exec
charge un fichier exécutable et remplace le programme actuel de l'image. Comme vous l'avez noté à juste titre,cd
est pas un fichier exécutable, mais plutôt d'une commande interne du shell. Si le fichier exécutable que vous voulez exécuter est le shell lui-même. C'est bien ce quesystem()
fait pour vous, mais si vous voulez être explicite à ce sujet, vous pouvez utiliserexec
:Depuis cette remplace votre processus actuel d'image, vous devez le faire après
fork()
ing hors d'un nouveau processus.Toutefois, cette procédure n'a absolument aucun effet. Si vous souhaitez changer de répertoire dans votre processus actuel, l'utilisation
chdir()
.Les arguments qui composent la commande est exécutée, et puisque c'est une variable d'argument de la fonction, nous devons signaler la fin de la arguments en quelque sorte, qui dans ce cas est terminé par un pointeur null de type
const char *
. Si la commande est exécutée est:/bin/sh -c cd
OriginalL'auteur Kerrek SB
Vous êtes mieux d'utiliser
int chdir(const char *path);
trouvé dansunistd.h
.OriginalL'auteur orlp
Alors que, comme déjà indiqué
system("cd xxx")
ne changez pas votre application répertoire courant, il n'est pas complètement inutile.Vous pouvez toujours utiliser le système de sortie de statut de savoir si la modification de votre répertoire courant à celui annoncé réussir ou pas.
De même, si vous le souhaitez des solutions complexes, vous pouvez également faire de même avec fork/exec, soit avec exec avec
/bin/sh -c cd xxx
ou tout simplement/bin/cd xxx
avec des Systèmes d'exploitation qui fournissent un indépendantcd
exécutable.Je voudrais cependant vous recommandons de cette non overkill plus rapide équivalent
access("xxx", X_OK|R_OK)
Note: Tous conformes à POSIX Systèmes d'exploitation doit fournir un disque indépendant exécutable. C'est au moins le cas avec Solaris, AIX, HP-UX et Mac OS/X.
cd
exécutable est juste et simple de l'impossible.Il est certainement l'un sur l'OS que j'utilise.
Sauvegarde le dernier paragraphe avec des pointeurs. E. g. lien à la fin de pubs.opengroup.org/onlinepubs/9699919799/utilities/..., où il est dit que tous les utilitaires standard, y compris la régulière built-ins [...], doit être mis en oeuvre de manière, de sorte qu'ils peuvent être accessibles via l'exec de la famille de fonctions. Et pour Solaris cd de l'homme docs.oracle.com/cd/E19253-01/816-5165/6mbb0m9bl/index.html que les états /usr/bin/cd n'a pas d'effet sur l'invocation, mais peut être utilisé pour déterminer si oui ou non un répertoire donné peut être définie comme le répertoire courant
merci, c'est fait.
OriginalL'auteur jlliagre
Non, il n'est pas, et il serait d'aucune utilité.
chdir
(la fonction qui change un répertoire courant du processus n'affecte que le processus qui l'appelle (et ses enfants). Il n'affecte pas sa mère en particulier.Donc
exec
ingcd
a aucun moment, depuis le processus de sortie immédiatement après avoir changé de répertoires.(Vous pourriez exec quelque chose comme
bash -c cd /tmp
si vous voulez vraiment, mais comme je l'ai dit, c'est inutile.)OriginalL'auteur Mat
Lorsque la fourche est en fait la variable d'environnement MDC(répertoire de travail courant) est héritée par l'enfant de la mère.Si fork et exec est fait comme d'habitude alors que l'enfant appelle chdir() qui change simplement le répertoire vers le nouveau et les sorties, mais cela n'affecte pas le parent.Ainsi, le nouvel environnement est perdu..
OriginalL'auteur bnsk