IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

faire la commande cd:change directory dans un interpréteur


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Par défaut faire la commande cd:change directory dans un interpréteur
    bonjour tout le monde
    je suis en train de faire un programme en C qui simule un intérpréteur de commande.
    donc j'utilise la création des processus fils en passant un tableau d'arguments à execvp.
    mon problème est au niveau de la commande cd car j'ai besoin de changer le répertoire du travail du processus au niveau du PCB.
    j'ai besoin de vos suggestions s'il y a des fonctions en C qui manipulent cela.
    merci pour votre aide et compréhension.

  2. #2
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut Re: faire la commande cd:change directory dans un interpréte
    Citation Envoyé par madimane
    bonjour tout le monde
    je suis en train de faire un programme en C qui simule un intérpréteur de commande.
    donc j'utilise la création des processus fils en passant un tableau d'arguments à execvp.
    Pas portable. sprintf() + system() devraient suffire...
    mon problème est au niveau de la commande cd car j'ai besoin de changer le répertoire du travail du processus au niveau du PCB.
    What the hell is PCB ?

    Pour changer de répertoire, il y a une fonction POSIX.1 chdir()...

    http://www.unix.org/single_unix_specification/

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    NAME
     
        chdir - change working directory
     
    SYNOPSIS
     
        #include <unistd.h>
     
        int chdir(const char *path);
    <...>

  3. #3
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Par défaut
    bonjour
    merci d'avoir répondu à ma question
    j'ai essayé la fonction chdir() et ca marche mais il y a un problème quand même.
    le problème c'est que lorsque le chdir() échoue une fois(par ex répertoire inexistant) alors elle échoue toujours après même si on lui passe un répertoire existatnt .
    si vous avez une idée sur ce comportement veuillez me le signaler.
    voila comment je l'utilise
    .....
    ....
    ....
    if((resultat_ligne != EXIT_TROUVE) && !strcmp(arguments[0],"cd"))
    {
    pwd = getenv("PWD");
    pwd = strcat(pwd,"/");
    pwd = strcat(pwd,arguments[1]);
    if(chdir(pwd) == -1)
    printf("repertoire non valide");
    }
    ...
    ....
    merci pour votre aide

  4. #4
    Expert éminent
    Avatar de Emmanuel Delahaye
    Profil pro
    Retraité
    Inscrit en
    Décembre 2003
    Messages
    14 512
    Détails du profil
    Informations personnelles :
    Âge : 68
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Retraité

    Informations forums :
    Inscription : Décembre 2003
    Messages : 14 512
    Par défaut
    Citation Envoyé par madimane
    le problème c'est que lorsque le chdir() échoue une fois(par ex répertoire inexistant) alors elle échoue toujours après même si on lui passe un répertoire existant .
    Jamais entendu parlé de ça !
    si vous avez une idée sur ce comportement veuillez me le signaler.
    voila comment je l'utilise
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    if((resultat_ligne != EXIT_TROUVE) && !strcmp(arguments[0],"cd"))
    {
            pwd = getenv("PWD");
            pwd = strcat(pwd,"/");
    STOP. pwd est un pointeur sur une zone non modifiable dont la taille n'est pas extensible. Tenter d'écrire au-delà invoque un comportement indéfini. Utiliser une copie d'une taille suffisante (tableau local, dynamique...)

    http://www-ccs.ucsd.edu/c/stdlib.html#getenv

  5. #5
    Membre averti
    Profil pro
    Inscrit en
    Octobre 2005
    Messages
    29
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2005
    Messages : 29
    Par défaut
    ok merci
    dans le fond je n'avais pas besoin de préparer la chaine "/argv[1]"
    car le chdir fait cela par défaut(elle récupère la variable d'environnement et elle fait le necéssaire).
    donc la solution était juste
    if(chdir(arguments[1]) == -1)
    printf("%s: ce fichier ou ce repertoire n'existe pas\n",arguments[1]);
    on fait l'appel juste avec le nom du repertoire.
    donc le problème est résolu
    merci infiniment pour votre aide

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Faire exécuter une commande d'un bash dans un autre bash
    Par Mazman dans le forum Shell et commandes POSIX
    Réponses: 3
    Dernier message: 06/12/2011, 07h07
  2. comment faire un cd(change directory)
    Par inno007 dans le forum ASP.NET
    Réponses: 3
    Dernier message: 20/03/2008, 19h01
  3. Réponses: 3
    Dernier message: 02/07/2004, 13h53
  4. Comment faire un retour a la ligne dans un tableaux Word
    Par alexmorel dans le forum API, COM et SDKs
    Réponses: 2
    Dernier message: 17/06/2004, 09h31
  5. Réponses: 6
    Dernier message: 14/05/2004, 11h18

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo