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

Langage C++ Discussion :

[C++][LINUX]Commande system ne fonctionne pas


Sujet :

Langage C++

  1. #1
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2009
    Messages : 110
    Points : 85
    Points
    85
    Par défaut [C++][LINUX]Commande system ne fonctionne pas
    Bonjour à tous et à toutes.
    Je n'arrive pas à éxecuter la commande cp (copy) à partir de mon code C++.
    Voici mon code :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    char cmdSystem[100];
    sprintf(cmdSystem,"cp %s%s/%s_%s.dat %s%s_%s.dat",
    	getenv(val1),
    	getenv(val2),
    	val3,
    	val4,
    	val5,
    	val6,
    	val7);
    system(cmdSystem);
    Quand je débugue, la commande system renvoi la valeur -1.
    J'ai copier le contenu de cmdSystem et je l'ai exécuté sur ma console Linux sans problème.
    J'ai essayé avec ce code et ça fonctionne parfaitement:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    char buff[50];
    #define toto "toto"
    #define titi  "titi"
    sprintf(buff,"cp %s %s", toto, titi);
    system(buff);
    Est-ce que vous avez d'autres idées sur l'origine de ce dysfonctionnement ?
    Merci par avance.

  2. #2
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Salut,

    A part ton tableau cmdSystem qui me semble un peu petit, je ne vois pas. As-tu essayer avec une taille beaucoup plus grande ?

    Sinon puisque tu as posté dans le forum c++, pourquoi ne pas faire ça en c++ en non en C comme tu l'as fait ? Pas de problème d'allocation mémoire avec la classe std::string par exemple.

    a+
    jmv

  3. #3
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2009
    Messages : 110
    Points : 85
    Points
    85
    Par défaut
    Merci jmv pour ta réponse.
    A part ton tableau cmdSystem qui me semble un peu petit, je ne vois pas. As-tu essayer avec une taille beaucoup plus grande ?
    J'ai déjà essayé avec une taille beaucoup plus grande, sans résultat. Je me suis aussi assuré que la taille de ma commande ne dépasse pas la taille du char.
    Sinon puisque tu as posté dans le forum c++, pourquoi ne pas faire ça en c++ en non en C comme tu l'as fait ?
    Les fonctions que j'utilise sont aussi des fonction c++. Je ne vois pas ce que je peux modifier. Peut tu être plus précis STP ?

  4. #4
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    Citation Envoyé par mehdi_me85 Voir le message
    Les fonctions que j'utilise sont aussi des fonction c++. Je ne vois pas ce que je peux modifier. Peut tu être plus précis STP ?
    Ce que tu utilise est du C, c'est dans le C++ pour des raisons de compatibilité, ton programme se compilerait trés bien avec un compilateur exclusivement C.
    L'inconvénient de ton code c'est la taille de cmdSystem, il y aura toujours une limite (même très grande), avec la classe string, la seule limite est la capacité de ton ordi.

    Mais pour en revenir à ton problème, question bête, es-tu vraiment sûr des chemins ? Y a-t-il des espaces ou caractères accentués dans les chemins ?

  5. #5
    Membre du Club
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2011
    Messages
    35
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : Septembre 2011
    Messages : 35
    Points : 47
    Points
    47
    Par défaut
    Si tu es en C++ utilise std::string et non un char *.
    Tu auras moins de problème d'allocation mémoire et il sera beaucoup plus facile de remplir un string apres tu le modifie en char pour ta fonction system

  6. #6
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2009
    Messages : 110
    Points : 85
    Points
    85
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    es-tu vraiment sûr des chemins ? Y a-t-il des espaces ou caractères accentués dans les chemins
    Oui je suis sure de toute la commande cp. Je l'ai essayé directement sur ma console Linux, et ça fonctionne. Sinon, je n'ai aucun espace ou caractères accentués dans les chemins.
    Je précise que ce problème survient suite à une migration HP UNIX -> LINUX. Et qu'avant ça fonctionnait très bien.

  7. #7
    jmv
    jmv est déconnecté
    Membre confirmé Avatar de jmv
    Profil pro
    Enseignant
    Inscrit en
    Mai 2004
    Messages
    395
    Détails du profil
    Informations personnelles :
    Localisation : France, Ille et Vilaine (Bretagne)

    Informations professionnelles :
    Activité : Enseignant

    Informations forums :
    Inscription : Mai 2004
    Messages : 395
    Points : 603
    Points
    603
    Par défaut
    J'ai fait un petit essai sur ubuntu
    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
    #include <stdio.h>
    #include <stdlib.h>
     
    int main()
    {
    	char* val1 = "VAR1";
    	char* val2 = "VAR2";
     
    	char* val3 = "machin";
    	char* val4 = "truc";
     
    	char* val5 = "aaaa";
    	char* val6 = "bbbb";
    	char* val7 = "cccc";
     
    	char cmdSystem[10000];
    	sprintf(cmdSystem,"cp %s%s/%s_%s.dat %s%s_%s.dat",
    	getenv(val1),
    	getenv(val2),
    	val3,
    	val4,
    	val5,
    	val6,
    	val7);
     
    	printf("[%s]\n", cmdSystem); 
    	//system(cmdSystem);
    	return 0;
    }
    Quand je compile j'ai droit à un petit warning :
    essai.cpp:7: warning: deprecated conversion from string constant to ‘char*’


    et à l'éxecution :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    VAR1=TOTO
    VAR2=2000
    ./a.out
    ça me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [cp (null)(null)/machin_truc.dat aaaabbbb_cccc.dat]
    et lorsque je rajoute la commande export VAR1 VAR2 ça marche:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    VAR1=TOTO
    VAR2=2000
    export VAR1 VAR2
    ./a.out
    ça me donne :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    [cp toto2000/machin_truc.dat aaaabbbb_cccc.dat]
    Je pense donc que ton pb vient des variables d'environnement qui ne sont pas exportées (peut-être une différence entre hp-unix et linux, cette différence peut venir du shell utilisé, bash chez moi).

  8. #8
    Membre régulier
    Profil pro
    Inscrit en
    Avril 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France, Isère (Rhône Alpes)

    Informations forums :
    Inscription : Avril 2009
    Messages : 110
    Points : 85
    Points
    85
    Par défaut
    Merci jmv d'avoir pris la peine d'essayer.
    Mon printf m'affiche la bonne commande. J'ai l'impression que le problème provient du code retour de la fonction system. La fonction system renvoie la valeur -1. Un test est effectuté dans mon code pour arrêter le programme dans ce cas :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if (system(cmdSystem) == -1) exit;
    Dans la doc Linux, j'ai trouvé :
    Description
    system() executes a command specified in command by calling /bin/sh -c command, and returns after the command has been completed. During execution of the command, SIGCHLD will be blocked, and SIGINT and SIGQUIT will be ignored.

    Return Value
    The value returned is -1 on error (e.g. fork() failed), and the return status of the command otherwise.
    J'ai enlever la condition et j'ai constaté que mon fichier est bien copié.
    Je ne comprend pas le sens de ce code retour.

Discussions similaires

  1. [la commande ppm ne fonctionne pas ? ]
    Par modesty12 dans le forum Alimentation
    Réponses: 1
    Dernier message: 31/05/2007, 16h35
  2. [WB9] Une commande Webdev ne fonctionne pas
    Par Tina51 dans le forum WebDev
    Réponses: 4
    Dernier message: 16/03/2007, 22h24
  3. Boutons de commande qui ne fonctionnent pas
    Par Shakti dans le forum IHM
    Réponses: 4
    Dernier message: 24/11/2006, 16h29
  4. La commande cd ne fonctionne pas
    Par keiserjo dans le forum Shell et commandes GNU
    Réponses: 4
    Dernier message: 06/10/2006, 22h53
  5. Réponses: 13
    Dernier message: 31/08/2005, 14h03

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