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 :

Création de dossier et de fichier sous linux en C


Sujet :

C

  1. #1
    Nouveau candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Août 2012
    Messages
    1
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Août 2012
    Messages : 1
    Par défaut Création de dossier et de fichier sous linux en C
    Bonjour à tous,

    Etudiant en informatique, il m'est demandé de créer un shell en C qui execute toujours la même commande quelque soit ce que l'utilisateur écrive (et exit lorsque l'utilisateur rentre "exit").
    J'ai réussi à le faire pour des commandes simples tel que "mkdir", "ls", etc dont voici le code :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
     
    #include <stdio.h>
    #include <stdlib.h>
    #include <unistd.h>
    #include <string.h>
     
    int main ()
    {   int i;
        char *ligne;
        char *tokens[100];
        char *cmd;
        char *commande = "mkdir brol";
     
        ligne=(char*)malloc(300);
        printf("$ ");
        fgets(ligne,256,stdin);
     
        while (strcmp(ligne,"exit\n"))
        {  
            i=0;
            cmd = strdup(commande);
            tokens[i]=strtok(cmd, " \n");
            while (tokens[i] != NULL) tokens[++i]=strtok(NULL," \n");
            if (fork()==0)
            {   execvp(tokens[0],tokens);
                printf("Commande invalide\n");
                exit(1);
            }
            wait(0);
            free(cmd);
            printf("$ ");
            fgets(ligne,256,stdin);
        }
        exit(0);
    }
    Le problème, c'est qu'il m'est demandé de faire cela pour la commande "mkdir brol && (cd brol;>f)" . Lorsque j'utilise cette commande, le programme crée 3 dossiers "&&", "brol;>f", "brol", et "(cd".

    Comment faire pour que ce programme execute bien la commande "mkdir brol && (cd brol;>f)", c'est à dire, qu'elle crée un dossier "brol" et crée un fichier "f" dedans ?

    Merci d'avance pour votre aide

  2. #2
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 059
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 059
    Billets dans le blog
    142
    Par défaut
    Bonjour,

    Je souhaite avant même de répondre à votre question, vous faire quelques retours sur le code actuel.
    Premier conseil, toujours initialisé les variables à leurs déclarations :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int i;
        char *ligne;
        char *tokens[100];
        char *cmd;
        char *commande = "mkdir brol";
    deviendra :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    int i = 0;
        char *ligne = NULL;
        char *tokens[100] = {0};
        char *cmd = NULL;
        char *commande = "mkdir brol";
    Ensuite, pour chaque allocation de mémoire (malloc), il vous faut un free correspondant (sinon, c'est une fuite de mémoire) :
    Pour
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ligne=(char*)malloc(300);
    faire un
    avant la fin du programme.

    Ce test while (strcmp(ligne,"exit\n")) ne fonctionnera pas si j'entre "exit " (avec un espace à la fin). Il faudrait trouver une astuce pour enlever les surplus d'espace.
    Maintenant, à propos de la gestion de la commande, l'idée est de comprendre comment on doit la gérer. En effet, même si l'espace est un délimiteur, cela ne suffit pas toujours.
    Pour votre commande exemple
    mkdir brol && (cd brol;>f)
    elle doit être délimiter par '&&' (et exécuter la suite que si la première commande à réussie), puis par le ";". Les espaces ne doivent pas vraiment être pris en compte.
    Je vous conseille, au lieu d'utiliser strtok, d'utiliser une fonction bien à vous, qui sera spécialisé dans la décomposition de la commande et qui pourra aussi vous dire si le résultat d'une commande doit être vérifié. Pour ce genre de fonction, je verrai une signature du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int splitCommand(const char* input, char*** out, size_t* nbCommand);
    Le type de retour peut être remplacé par un enum. input est l'entrée et out un tableau de chaine de caractère qui sera alloué dans la fonction (un peu dangereux certes), ce qui explique que j'ai trois niveaux de pointeurs. nbCommand contiendra le nombre de commande décomposées (un pointeur car c'est la fonction qui détermine la valeur).
    Il est évidant qu'il faudra bien faire attention aux pointeurs et allocations de mémoire.

    (Peut être qu'il y a plus simple, mais dans l'immédiat, je ne vois pas )
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

Discussions similaires

  1. Spécifier type de système de fichiers sous linux
    Par rond24 dans le forum Administration système
    Réponses: 4
    Dernier message: 07/03/2006, 20h09
  2. Téléchargement de fichier sous Linux
    Par patrick_lassaly dans le forum Administration système
    Réponses: 1
    Dernier message: 03/01/2006, 11h31
  3. fichier sous linux
    Par razord dans le forum C
    Réponses: 2
    Dernier message: 19/09/2005, 11h54
  4. Exclusivité sur un fichier sous linux
    Par ggnore dans le forum Administration système
    Réponses: 4
    Dernier message: 03/11/2004, 09h46
  5. Les fichiers sous linux/windows
    Par Stessy dans le forum Linux
    Réponses: 5
    Dernier message: 05/12/2003, 09h30

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