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 :

utilisation des commandes shell dans un programme C


Sujet :

Linux

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut utilisation des commandes shell dans un programme C
    Bonjour,

    Je developpe sur une machine linux, une application en C, avec un interpreteur de commande redumentaire.
    J'ai besoin de pouvoir entrer quelques commandes shell simples style : ls, cd
    a mon interpreteur qui se chargera de recupperer la ligne et de transferer son execution.

    J'ai essayé d'utiliser : ça marche, par contre si je fais : ça ne marche pas, d'apres ce que je comprends c'est paske "cd" est une commande interne au shell et pas un programme externe comme "ls".

    Est ce que quelqu'un peut me dire comment faire pour:
    utiliser des commandes shell depuis un programme en C

    merci!

  2. #2
    Rédacteur/Modérateur

    Avatar de gorgonite
    Homme Profil pro
    Ingénieur d'études
    Inscrit en
    Décembre 2005
    Messages
    10 322
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur d'études
    Secteur : Transports

    Informations forums :
    Inscription : Décembre 2005
    Messages : 10 322
    Points : 18 679
    Points
    18 679
    Evitez les MP pour les questions techniques... il y a des forums
    Contributions sur DVP : Mes Tutos | Mon Blog

  3. #3
    Expert éminent
    Avatar de Michaël
    Profil pro
    Ingénieur systèmes et réseaux
    Inscrit en
    Juillet 2003
    Messages
    3 497
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Ingénieur systèmes et réseaux

    Informations forums :
    Inscription : Juillet 2003
    Messages : 3 497
    Points : 8 237
    Points
    8 237
    Par défaut
    tu ne peux pas passer avec chdir() ?
    tu es sûr que tu utilises systeme ?

  4. #4
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par rasgueados
    si je fais : ça ne marche pas
    C'est a dire [et c'est system(), pas systeme()] ? Il faut bien comprendre que lorsque tu appelles system(), une nouvelle session shell est creee. Ta commande cd est appliquee a cette nouvelle session. Au retour de la fonction system(), la session se termine : il n'y a eu aucun changement pour ton programme (i.e. le cwd du programme est toujours le meme).
    Si tu veux faire plusieurs choses a la suite, il ne faut donc pas faire plusieurs system() de suite, mais un seul qui appelle un script shell contenant la suite d'instructions a appliquer. Si tu veux en plus avoir la sortie du script, il faut rediriger la sortie vers un fichier.
    Un exemple (sans prendre en compte les cas d'erreur, pour simplifier):
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    f = fopen("script.ksh", "w");
    fprintf(f, "cd /toto/titi\n");
    fprintf(f, "ls -l");
    fclose(f);
     
    system("script.ksh > script.out");
    /* lire script.out pour avoir le resultat de l'execution du script */
    Tu peux aussi utiliser les fonctions systemes directement.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Oui je suis bien sur d'utiliser "system" sans e au bout.

    J'ai essayé tout cela, sans succes:

    system("cd bin/");
    system("cd /bin");
    system("cd bin/");
    system("cd /bin/");

    system("chdir bin/");
    system("chdir /bin");
    system("chdir bin/");
    system("chdir /bin/");

    avec chdir j'ai meme un message : sh: line1: chdir: command not found
    pourtant quand je la tape eu ligne de commande elle marche ...

    Avez vous d'autres idées ?

    merci.

  6. #6
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par DaZumba
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    system("script.ksh > script.out");
    Merci pour ton explication, si je veux voir le resultat de l'execution du script sur sur la sortie standard, je fais comment ?
    system("script.ksh > ???

    Citation Envoyé par DaZumba
    Tu peux aussi utiliser les fonctions systemes directement.
    Est ce que tu peux m'un dire un peu plus a ce sujet.

  7. #7
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    system("bash -c 'cd bin'");
    pour changer le répertoire courant, utilise chdir

    http://man.developpez.com/man2/chdir.2.php

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par DaZumba
    Il faut bien comprendre que lorsque tu appelles system(), une nouvelle session shell est creee. Ta commande cd est appliquee a cette nouvelle session. Au retour de la fonction system(), la session se termine : il n'y a eu aucun changement pour ton programme (i.e. le cwd du programme est toujours le meme).
    Est ce possible de ne pas creer de nouvelle session shell, et que mes commandes soit appliquées a la session shell de mon programme ?

    merci encore pour vos lumieres !

  9. #9
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par rasgueados
    Est ce possible de ne pas creer de nouvelle session shell, et que mes commandes soit appliquées a la session shell de mon programme ?
    Citation Envoyé par laurentschneider
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    system("bash -c 'cd bin'");
    pour changer le répertoire courant, utilise chdir
    Si je comprends bien tu viens de repondre a ma question avant meme d'en avoir eut connaissance !

    par contre je saisi pas la differene entre cd et chdir

  10. #10
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    chdir, c'est du C

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    chdir("/bin");
    system("bash -c 'cd /bin'");
    tu vois?

  11. #11
    Expert confirmé
    Avatar de laurentschneider
    Homme Profil pro
    Administrateur de base de données
    Inscrit en
    Décembre 2005
    Messages
    2 944
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Suisse

    Informations professionnelles :
    Activité : Administrateur de base de données
    Secteur : Finance

    Informations forums :
    Inscription : Décembre 2005
    Messages : 2 944
    Points : 4 926
    Points
    4 926
    Par défaut
    c'est vrai qu'en DOS, si j'ai bonne mémoire, cd et chdir sont équivalents

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par laurentschneider
    chdir, c'est du C

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
     
    chdir("/bin");
    system("bash -c 'cd /bin'");
    tu vois?
    OK, expliqué comme cela c'est tres clair.

    Citation Envoyé par laurentschneider
    c'est vrai qu'en DOS, si j'ai bonne mémoire, cd et chdir sont équivalents
    c'est pas que je soit perdu en dehors du DOS, je ni commais rien.
    C'est juste que je suis pas expert dans le monde UNIX/LINUX,
    jusqu'a maintenant je faisait du SW embarqué avec des OS genre pSos mais maintenant on passe a Linux alors c'est la decouverte d'un nouveau monde.

    S'il vous plait un peu d'indulgence pour les novices

  13. #13
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    En gros, tu as deux facon de faire les choses:

    - appeler un script (i.e. un fichier texte au format executable qui appelle plein de petits executables differents pour faire une action complexe) en utilisant system(). Il ne faut pas oublier que deux appels de system() sont completement independants. Ce que tu as fait dans l'un n'est pas repercute dans l'autre (a moins bien sur que tu aies cree un fichier...). Remarque aussi que creer un programme C qui ne fait qu'appeler un script avec system(), c'est ecraser une mouche avec un marteau-pilon. Autant utiliser le script directement.

    - utiliser les fonctions systemes de la bibliotheque de l'OS Linux comme chdir() ou stat(). Ce sont des fonctions C, utilisables directement dans ton programme. Pour avoir des informations sur ces fonctions, tapes
    et
    dans le terminal. Cela te montrera comment les utiliser dans ton programme. Regarde aussi la FAQ C qui montre comment faire les taches les plus frequentes.

    La solution 2 est la plus propre dans ton cas, puisque tu codes une petite shell. Mais c'est aussi plus difficile.

  14. #14
    Membre expérimenté
    Inscrit en
    Décembre 2004
    Messages
    1 478
    Détails du profil
    Informations forums :
    Inscription : Décembre 2004
    Messages : 1 478
    Points : 1 664
    Points
    1 664
    Par défaut
    Citation Envoyé par rasgueados
    si je veux voir le resultat de l'execution du script sur sur la sortie standard, je fais comment ?
    Ben tu fais
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    system("script.ksh");
    Tout court. Mais je ne vois guere l'interet, puisque les infos produites par le script ne sont plus accessibles par le programme. C'est pourquoi on redirige vers un fichier, pour ensuite lire ce fichier et connaitre le resultat de l'execution du script...

  15. #15
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    merci pour vos infos,

    J'ai reussi a faire ce que je voulais,
    mon application me propse un menu,
    une entrée du menu correspond a l'execution d'une commande shell, ls, chdir, pwd, clear.
    ce qui me permet de naviguer dans l'arborescence pour que mon application memorise le path de fichiers a utiliser plus tard.

    c'est tres basique, mais facilement comprehensible et reutilisable par un novice.
    pour nous c'est nickel, car ce sur quoi on doit depenser de l'effort.

    Thanx

  16. #16
    Candidat au Club
    Profil pro
    Inscrit en
    Août 2006
    Messages
    8
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France, Calvados (Basse Normandie)

    Informations forums :
    Inscription : Août 2006
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Citation Envoyé par rasgueados
    Au cas ou d'autres que moi aurais le meme besoin voici a quoi ressemble mes commandes:

    system("bash -c 'ls -l'");
    system("bash -c 'pwd'");
    chdir("..");
    chdir(path);

    Thanx

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

Discussions similaires

  1. Utiliser des commandes linux dans un shell
    Par Info_76 dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 20/03/2008, 12h03
  2. Réponses: 2
    Dernier message: 16/12/2006, 17h37
  3. Erreur utilisation des commandes shell
    Par paolo2002 dans le forum Windows XP
    Réponses: 7
    Dernier message: 05/11/2006, 14h09
  4. commande shell dans un programme
    Par diefo dans le forum C
    Réponses: 3
    Dernier message: 15/08/2003, 13h37
  5. Réponses: 2
    Dernier message: 24/06/2003, 20h31

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