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 :

Réecrire la commande pwd


Sujet :

C

  1. #1
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 3
    Par défaut Réecrire la commande pwd
    Bonjour à tous,

    Je suis spécialisé en réseau et pour mes études, je dois écrire un algorithme qui fait la meme chose que pwd (arborescence courant). Je dois utiliser des appels systèmes. La commande getpwd() ne doit pas etre utilisée.

    Merci de me dire par où commencer et quelles seront les grandes lignes de l'algo.

  2. #2
    Membre éprouvé
    Profil pro
    Inscrit en
    Avril 2006
    Messages
    107
    Détails du profil
    Informations personnelles :
    Localisation : France, Alpes Maritimes (Provence Alpes Côte d'Azur)

    Informations forums :
    Inscription : Avril 2006
    Messages : 107
    Par défaut
    Et pourquoi pas betement :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    printf("directory = \"%s\"", getenv("PWD") );

  3. #3
    Expert confirmé
    Avatar de Melem
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Janvier 2006
    Messages
    3 656
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : High Tech - Électronique et micro-électronique

    Informations forums :
    Inscription : Janvier 2006
    Messages : 3 656
    Par défaut
    La commande getpwd() ne doit pas etre utilisée.
    Tu ne voulais pas dire getcwd ? pwd veut dire print working directory. getcwd : get current wd. Je ne vois pas trop comment obtenir le répertoire courant sans appel système.

    EDIT : Quand je repense à la question, ne serait-ce pas la commande ls (List Directory) que tu veux recoder ? Dans ce cas c'est déjà dans la FAQ. Parce que un algo pour pwd, ça n'a aucun sens.

  4. #4
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 3
    Par défaut
    Bonsoir,
    merci pour vos réponses.
    En faite, l'appel systeme Getcwd n'est pas à utiliser car ça serait trop facile. Je me suis renseigné un peu.
    En gros, il faut jouer avec les numeros d'inodes et parcourir la hierarchie des dossiers avec des chdir(), puis voir l'inode grace au lstat() et s'arreter lorsque l'inode est egale à 2 (correspondant à /). Puis, il suffit de concatener les dossiers stockées en variables.

    Et puis pourquoi un algo pour pwd n'a aucun sens? Toutes les commandes peuvent etre ré implementer.

  5. #5
    Membre chevronné
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2006
    Messages
    507
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Pas de Calais (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Communication - Médias

    Informations forums :
    Inscription : Mai 2006
    Messages : 507
    Par défaut
    Bonjour,

    Citation Envoyé par Diez_Include Voir le message
    En gros, il faut jouer avec les numeros d'inodes et parcourir la hierarchie des dossiers avec des chdir(), puis voir l'inode grace au lstat() et s'arreter lorsque l'inode est egale à 2 (correspondant à /). Puis, il suffit de concatener les dossiers stockées en variables.
    Et bien pour l'algo ça à l'air d'être bon ! Non ?

  6. #6
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Attention à ta condition d'arrêt quand tu remontes dans l'arborescence : les numéros d'inodes sont uniques ... dans un même système de fichiers ! Si la racine "/" a pour inode 2 (est-ce d'ailleurs gravé dans le marbre ?), d'autres répertoires/fichiers peuvent avoir ce même numéro inode dans un autre système de fichiers.

    Sur mon système (avec une partition home montée sur /home) j'ai :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    plx@sony:~$ ls -id /
    2 /
    plx@sony:~$ ls -id /home
    2 /home
    plx@sony:~
    Pour être sur de s'arrêter, dans la remontée, à la racine, je testerais plutôt l'égalité entre le couple (inode,numéro de device) du répertoire courant ET du répertoire parent : '.' et '..' sont identiques SEULEMENT à la racine /.

    démo en python (transposable en C):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    plx@sony:~$ python
    Python 2.6.4 (r264:75706, Dec  7 2009, 18:45:15) 
    [GCC 4.4.1] on linux2
    Type "help", "copyright", "credits" or "license" for more information.
    >>> import os
    >>> print os.stat('/').st_ino, os.stat('/').st_dev
    2 2053
    >>> print os.stat('/..').st_ino, os.stat('/..').st_dev
    2 2053
    >>> print os.stat('/home').st_ino, os.stat('/home').st_dev
    2 2055
    >>> print os.stat('/home/..').st_ino, os.stat('/home/..').st_dev
    2 2053
    >>>
    De plus, un système de fichiers (autre que que le système racine /) peut ne pas être monté directement sous la racine. Dans ta remontée, tu peux donc passer par un numéro d'inode à 2, avoir n numéros d'inode tout à fait quelconques pour, enfin, arriver à la racine /.

  7. #7
    Candidat au Club
    Inscrit en
    Janvier 2010
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Janvier 2010
    Messages : 3
    Par défaut
    je vous remercie, je vais donc faire une condition qui comparer l'egalité des inodes et devices du repertoire courant et parent.

    Mais je bloque à la fin. Je ne sais pas comment faire pour stocker mes chemins?
    Est ce possible sans utiliser malloc()?

    Autre chose: comment disposer mon programme. Je mets tout dans le main? ou bien je fais une fonction qui est appelé dans le main.

    merci de votre aide

  8. #8
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    Mais je bloque à la fin. Je ne sais pas comment faire pour stocker mes chemins?
    Est ce possible sans utiliser malloc()?
    En utilisant FILENAME_MAX #défini dans stdio.h, tu peux ne pas utiliser d'allocaton dynamique pour construire le chemin absolu résultat. Sinon, pour stocker les répertoires parcourus, le mieux est de mettre à jour une chaine de caractères avec chaque nom de répertoire rencontré lors de la remontée. Il faut juste gérer le fait qu'on concatène les noms de répertoires "à l'envers" (à coup de memmove et de str[n]cpy).

    comment disposer mon programme. Je mets tout dans le main? ou bien je fais une fonction qui est appelé dans le main.
    Perso, je ferais ma boucle de remontée d'arborescence dans le main et une fonction qui scanne les fichiers contenus dans le répertoire parent, à la recherche des numéros d'inode et de device (arguments), et retourne le nom. On peut même passer la structure stat recherchée en entier comme argument et faire la comparaison dessus : ça allège l'écriture sans faire trop de choses en plus.

    Attention, par contre, à ne pas utiliser - c'est tentant, je suis tombé dans le panneau - le champ d_ino de la structure dirent (quand on scanne les fichiers d'un répertoire via readdir) pour le comparer au champ st_ino de la structure stat : ils ont des valeurs différentes aux points de montage des systèmes de fichiers (le répertoire "home" de mon post précédent)

  9. #9
    Expert confirmé

    Profil pro
    Inscrit en
    Janvier 2007
    Messages
    10 610
    Détails du profil
    Informations personnelles :
    Âge : 67
    Localisation : France

    Informations forums :
    Inscription : Janvier 2007
    Messages : 10 610
    Billets dans le blog
    2
    Par défaut
    Citation Envoyé par Melem Voir le message
    Tu ne voulais pas dire getcwd ? pwd veut dire print working directory. getcwd : get current wd. Je ne vois pas trop comment obtenir le répertoire courant sans appel système.

    EDIT : Quand je repense à la question, ne serait-ce pas la commande ls (List Directory) que tu veux recoder ? Dans ce cas c'est déjà dans la FAQ. Parce que un algo pour pwd, ça n'a aucun sens.
    Moi je ferais :


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int main ( int argc, char **argv )
    {
    char *progname = strdup(argv[0]) ;
    ..
    }

    Ensuite, je regarde si ce proganme contient déjà des répertoires. Auqel cas on est en relatif..

    Si on est en relatif, le problème est a priori insoluble.

    Si on n'est pas en relatif, je me servirais des fonctions de dirent pour parcourir et trouver le fichier portant le nom progname...

    Si maintenant on était en relatif, la seule possibilté de rendre un résultat correct est si il n'existe qu'un seul répertoire correspondant à la profondeur suggérée par le chemin relatif (du style "../../../bin/toto", et un seul répertoire de profondeur 4 ))

  10. #10
    Membre Expert Avatar de plxpy
    Homme Profil pro
    Ingénieur géographe
    Inscrit en
    Janvier 2009
    Messages
    792
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 60
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Ingénieur géographe
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Janvier 2009
    Messages : 792
    Par défaut
    je dois écrire un algorithme qui fait la meme chose que pwd (arborescence courant). Je dois utiliser des appels systèmes. La commande getpwd() ne doit pas etre utilisée.
    @souviron34 : je pense que tu as mal compris la question. Le but est de réécrire la commande pwd sans utiliser les fonctions getcwd ou getwd. La réponse que doit fournir l'appli est complètement indépendante du répertoire où se trouve l'exécutable. Le argv[0] n'est d'aucune utilité (d'autant plus que, si l'exécutable est mis dans un répertoire du PATH, et donc potentiellement lancable par un simple "monpwd", comment en déduire le répertoire courant et son chemin absolu ?)

    C'est bien comme le laissait supposer Diez_Include par des comparaisons de structures stat (celle de '.' et celles des fichiers (au sens large) contenus dans le répertoire parent) et des remontées successives dans l'arborescence (chdir) qu' on retrouve et reconstruit le path absolu du répertoire courant.

Discussions similaires

  1. Réponses: 2
    Dernier message: 08/02/2013, 17h21
  2. masquer le pwd dans la commande exp
    Par Kholle dans le forum Import/Export
    Réponses: 5
    Dernier message: 13/11/2009, 14h24
  3. réecrire la commande cat
    Par waldner77 dans le forum Débuter
    Réponses: 7
    Dernier message: 07/09/2009, 21h41
  4. Réecrire la commande dir
    Par judge06 dans le forum C
    Réponses: 8
    Dernier message: 05/05/2007, 02h22
  5. Commande home pwd
    Par ajsd0208 dans le forum Shell et commandes GNU
    Réponses: 3
    Dernier message: 23/01/2006, 18h37

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