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 :

Shell/c commande exec


Sujet :

C

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Août 2007
    Messages
    98
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Août 2007
    Messages : 98
    Par défaut Shell/c commande exec
    Voici mon 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
     
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main ( int argc, char *argv[] )
    {
    int retour=0;
    char *arg []={"cp","*",argv[1],NULL};
     
    	if ( argc== 1)
    	{
    		execv("/bin/cp",arg);
    	}
     
    	else
    	{
    		printf ( "usage : argument1 arg1\n" );
    	}
            /* Jamais execute si ma commande à été exécuté mais bon c'est juste pour tester ! */
    	return EXIT_SUCCESS;
    }
    Si je tente grace à ce code d'executer la commande "cp * ../test" pour copier le contenu du repertoire a partir duquel j'execute mon pg, cela échoue, il ne trouve pas "*".
    (je lance le pg en ecrivant ./nomDuPg ../test en me plaçant dans le repertoire de mon exe)

    En revanche si je spécifie un nom de fichier au lieu de * cela fonctionne bien.

    Je pense savoir d'ou cela provient :

    Si je tape cp * ../test dans une console, le shell "traduit" le caractere * en la liste des fichier du repertoire avant (entre autre) d'exécuter /bin/cp avec ces noms comme parametre.
    Lorsque j'utilise execv je donne directement comme parametre à cp "*" qui n'est pas traduit par le shell en la liste des fichiers du repertoire.

    Mes questions :
    - Mon interprétation est-elle correcte ? En effet j'ai trouvé sur plusieurs sites des personnes qui utilise execv avec * pour copier tout le repertoire par exemple. Donc si ca marche chez eux pourquoi pas chez moi ?

    - Quelle est la solution pour grace à exec pouvoir utiliser les caratères spéciaux du shell dans une commande ?

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Janvier 2008
    Messages
    16
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2008
    Messages : 16
    Par défaut
    Salut ^^,

    Si tu programme sous linux, tu peux toujours essayer de lister le repertoire proprement avec les fonctions bas niveau :

    http://www.linux-kheops.com/doc/man/...opendir.3.html

    Ca doit pourvoir se faire sous windows mais je connais pas le nom des fichiers d'entête.

    Ensuite tu te fait ton propre "cp"

    Ca peut être un super exercice...

  3. #3
    Membre chevronné Avatar de cmoibal
    Profil pro
    Inscrit en
    Avril 2007
    Messages
    361
    Détails du profil
    Informations personnelles :
    Localisation : Tunisie

    Informations forums :
    Inscription : Avril 2007
    Messages : 361
    Par défaut
    Citation Envoyé par pmier Voir le message
    Voici mon 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
     
     
    #include <stdio.h>
    #include <stdlib.h>
     
    int main ( int argc, char *argv[] )
    {
    int retour=0;
    char *arg []={"cp","*",argv[1],NULL};
     
        if ( argc== 1)
        {
            execv("/bin/cp",arg);
        }
     
        else
        {
            printf ( "usage : argument1 arg1\n" );
        }
            /* Jamais execute si ma commande à été exécuté mais bon c'est juste pour tester ! */
        return EXIT_SUCCESS;
    }
    Si je tente grace à ce code d'executer la commande "cp * ../test" pour copier le contenu du repertoire a partir duquel j'execute mon pg, cela échoue, il ne trouve pas "*".
    (je lance le pg en ecrivant ./nomDuPg ../test en me plaçant dans le repertoire de mon exe)

    En revanche si je spécifie un nom de fichier au lieu de * cela fonctionne bien.

    Je pense savoir d'ou cela provient :

    Si je tape cp * ../test dans une console, le shell "traduit" le caractere * en la liste des fichier du repertoire avant (entre autre) d'exécuter /bin/cp avec ces noms comme parametre.
    Lorsque j'utilise execv je donne directement comme parametre à cp "*" qui n'est pas traduit par le shell en la liste des fichiers du repertoire.

    Mes questions :
    - Mon interprétation est-elle correcte ? En effet j'ai trouvé sur plusieurs sites des personnes qui utilise execv avec * pour copier tout le repertoire par exemple. Donc si ca marche chez eux pourquoi pas chez moi ?

    - Quelle est la solution pour grace à exec pouvoir utiliser les caratères spéciaux du shell dans une commande ?
    pour tester votre idée tu peut créer votre commande avant de lancer le execv. avec sprintf par exemple.
    mais normalement ce que tu vient de dire n'est pas vrai, parce que la fonction execv() va créer un chaine de commande avec tous les arguments necessaire.

Discussions similaires

  1. [TP] Commande exec : exécuter un batch de manière invisible
    Par freezerhm dans le forum Turbo Pascal
    Réponses: 1
    Dernier message: 18/03/2007, 14h18
  2. [Système] Commande exec distant
    Par fifi774 dans le forum Langage
    Réponses: 4
    Dernier message: 04/01/2007, 10h19
  3. [Système] commande exec en arriere plan
    Par dgedge dans le forum Langage
    Réponses: 3
    Dernier message: 03/07/2006, 14h45
  4. Réponses: 10
    Dernier message: 02/03/2006, 11h36
  5. [Système] commande exec()
    Par Stef784ever dans le forum Langage
    Réponses: 5
    Dernier message: 24/11/2005, 10h53

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