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

Linux Discussion :

Création d'un shell


Sujet :

Linux

  1. #1
    Membre actif
    Inscrit en
    Juin 2006
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 431
    Points : 209
    Points
    209
    Par défaut Création d'un shell
    Salut, je cherche à créer un shell simplifié en C, avec entrée d'une commande par l'utilisateur, puis execution de la commande et de ses paramètres éventuels. Je bute sur la détection de ces paramètres.
    j'utilise un fork pour obtenir un processus fils, et je désire lancer ma commande dans ce processus donc avec la fonction execl.
    grosso modo ca devrais ressembler à ca, sauf que je ne vois pas comment faire pour faire fonctionner execl:
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    int main ()
       {
           char commande[100];
           pid_t pid;
           scanf("%s",&commande);
           pid = fork();
           switch (pid)
               {
                    case 0 : execl(commande); break;
                    case -1 : printf("erreur"); break;
                    default : printf("On est dans le pere"); break;
               }
           return 0;

  2. #2
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Salut,

    Ne faut-il pas faire :
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    case 0 : execl(commande, commande, (char *)NULL); break;

    Enfin c'est ce que semble dire la page de manuel de execl :
    Citation Envoyé par man execl
    int execl(const char *path, const char *arg, ...);

    <...>

    Les arguments const char *arg ainsi que les points de suspension des
    fonctions execl(), execlp(), et execle() peuvent être vues comme arg0,
    arg1, ..., argn. Ensemble, ils décrivent une liste d'un ou plusieurs
    pointeurs sur des chaînes de caractères terminées par des caractères
    nuls, qui constituent les arguments disponibles pour le programme à
    exécuter. Par convention, le premier argument doit pointer sur le nom
    du fichier associé au programme à exécuter. La liste des arguments doit
    se terminer par un pointeur NULL, et puisque ce sont des fonctions
    variadiques, ce pointeur doit être transtypé avec (char *) NULL.

  3. #3
    Membre actif
    Inscrit en
    Juin 2006
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 431
    Points : 209
    Points
    209
    Par défaut
    je dirais plutot, non?
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    case 0 : execl(commande, arg1, arg2, (char *)NULL); break;
    Enfin d'après ce que j'ai compris... Mais je n'arrive pas à extraire les arguments de la chaine. La fonction getopt ne marche d'apres ce que j'ai compris que si les arguments sont passés au main, donc ce n'est pas applicable dans mon cas je pense.

  4. #4
    Membre chevronné

    Profil pro
    Inscrit en
    Mars 2004
    Messages
    1 296
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2004
    Messages : 1 296
    Points : 1 803
    Points
    1 803
    Par défaut
    ton scanf ne recupere qu'une chaine tel qu'il est ecrit, il te faut modifier la maniere de lire le(s) parametre(s) en tenant compte qu'ils puisse y en avoir plusieurs, ou alors traiter la variable commande pour extraire chaque arguments.

    De plus scanf est potentielement tres dangereux tel que tu l'utilise (entre autre le "buffer overflow" , tu dimensionne a 100 caractere et si l'utilisateur en ecrit 110 ?

    poster dans le forum C t'apportera beaucoup plus de reponse .

  5. #5
    Membre confirmé Avatar de Tchetch
    Inscrit en
    Mars 2002
    Messages
    401
    Détails du profil
    Informations personnelles :
    Âge : 39

    Informations forums :
    Inscription : Mars 2002
    Messages : 401
    Points : 477
    Points
    477
    Par défaut
    Code C : Sélectionner tout - Visualiser dans une fenêtre à part
    case 0 : execl(commande, commande, (char *)NULL); break;

    Je suis parti de l'affirmation (le scanf("%s") me la soufflé) ou il veut traiter que la commande, sans argument. Donc commande contient genre : [l][s][\0] et comme tout programme veut être l'argument 0, on remet ça dans la liste d'argument.

  6. #6
    Membre actif
    Inscrit en
    Juin 2006
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 431
    Points : 209
    Points
    209
    Par défaut
    j'utilise un tableau de 100 car pour l'instant je fais des tests basiques. Je continue mes tests, je crois que j'ai une idée.

  7. #7
    Rédacteur
    Avatar de Arnaud F.
    Homme Profil pro
    Développeur COBOL
    Inscrit en
    Août 2005
    Messages
    5 183
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    Localisation : France

    Informations professionnelles :
    Activité : Développeur COBOL
    Secteur : Finance

    Informations forums :
    Inscription : Août 2005
    Messages : 5 183
    Points : 8 873
    Points
    8 873
    Par défaut
    Utilise la coloration syntaxique, j'ai modéré ton post et maintenant on peut voir qu'une double-quote est en trop dans ton code, je ne sais pas si ça vient d'une erreur de copier/coller, mais enlève là

    ++

  8. #8
    Membre actif
    Inscrit en
    Juin 2006
    Messages
    431
    Détails du profil
    Informations forums :
    Inscription : Juin 2006
    Messages : 431
    Points : 209
    Points
    209
    Par défaut
    c'est cool cette coloration syntaxique .
    Enfin c'est bon j'ai réglé mon problème en passant par des pointeurs, et en rentrant les informations directement. Merci pour votre aide.

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

Discussions similaires

  1. aides pour script en shell
    Par komatek dans le forum Langages de programmation
    Réponses: 2
    Dernier message: 12/08/2003, 15h36
  2. [VB6] comment savoir si la commande shell est terminée ?
    Par ghyscharlotte dans le forum VB 6 et antérieur
    Réponses: 5
    Dernier message: 30/07/2003, 19h12
  3. Retour de requete postgresql / Shell Script
    Par doohan dans le forum Requêtes
    Réponses: 3
    Dernier message: 26/06/2003, 18h07
  4. [SHELL] Icônes associées à des fichiers
    Par agh dans le forum API, COM et SDKs
    Réponses: 5
    Dernier message: 09/04/2003, 17h04
  5. [Kylix] probleme pour lancer le shell
    Par miky dans le forum EDI
    Réponses: 5
    Dernier message: 13/08/2002, 09h39

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