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 :

C++ et exec fonctions


Sujet :

C++

  1. #1
    Membre régulier
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Points : 94
    Points
    94
    Par défaut C++ et exec fonctions
    Bonjour,

    Je suis en train d'utiliser la fonction "execvp" mais je me trouve face à un warning qui me donne du fil à retordre.

    J'ai le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *const argv[] = { "/bin/sleep", "20", mullptr};
    execv(argv[0], argv);
    Si je compile mon code avec std=c++11, je me retrouve avec le warning suivant :
    ISO C++ forbids converting a string constant to ‘char*’
    Une solution est d'utiliser la fonction "strdup" mais ce n'est pas très "beau". De plus, qui fait un free de la mémoire.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    char *const argv[] = { strdup("/bin/sleep"), strdup("20"), mullptr};
    execv(argv[0], argv);
    Avez-vous une petite astuce pour éviter ce warning et rendre l'écriture du code plus simple.

    Merci d'avance

  2. #2
    Expert éminent sénior
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 629
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Analyste/ Programmeur

    Informations forums :
    Inscription : Juillet 2013
    Messages : 4 629
    Points : 10 554
    Points
    10 554
    Par défaut
    Et un truc tout bête : c'est ton tableau qui est constant, pas les chaînes de caractères. Et d'ailleurs le compilateur te le dit.

    Donc essaye const char* const argv[] = { "/bin/sleep", "20", mullptr};.

  3. #3
    Membre régulier
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Points : 94
    Points
    94
    Par défaut
    Merci pour la réponse mais cela ne répond pas à mon problème.

    Avec le code suivant :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    const char* const argv[] = { "/bin/sleep", "20", nullptr };
    execv(argv[0], argv);
    J'ai l'erreur suivante à la compilation :

    invalid conversion from 'const char* const *' to 'char* const*'
    Cela est normal car le prototype de execv

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    int execv (const char *path, char *const argv[]);
    Donc je n'arrive toujours pas à avoir un méthode simple et élégante pour utiliser cette fonction "execv".

  4. #4
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Pourquoi execv devrait-il prendre un tableau de chaînes non constantes en paramètres ?
    Soit la fonction est mauvaise et elle prend logiquement un tableau de chaînes constantes, soit la création de argv est incorrecte.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  5. #5
    Membre régulier
    Homme Profil pro
    Développeur en systèmes embarqués
    Inscrit en
    Février 2013
    Messages
    84
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur en systèmes embarqués
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Février 2013
    Messages : 84
    Points : 94
    Points
    94
    Par défaut
    Citation Envoyé par Bousk Voir le message
    Pourquoi execv devrait-il prendre un tableau de chaînes non constantes en paramètres ?
    C'est une fonction de "unistd.h" (https://linux.die.net/man/3/execv) donc je ne peux pas modifier le prototype.

    Citation Envoyé par Bousk Voir le message
    Soit la fonction est mauvaise et elle prend logiquement un tableau de chaînes constantes, soit la création de argv est incorrecte.
    La création du tableau est bien incorrecte pour répondre au prototype de la fonction mais cela est lourd.

  6. #6
    Rédacteur/Modérateur


    Homme Profil pro
    Network game programmer
    Inscrit en
    Juin 2010
    Messages
    7 115
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 115
    Points : 32 965
    Points
    32 965
    Billets dans le blog
    4
    Par défaut
    Citation Envoyé par Guillaume1701 Voir le message
    La création du tableau est bien incorrecte pour répondre au prototype de la fonction mais cela est lourd.
    Et ? Tu sais quel est le problème mais ne veux pas accepter la solution ? N'es pas capable de voir où est le problème alors que le compilateur te la donne ?
    C'est une fonction C, et probablement une vieille, donc d'autant plus souple avec la syntaxe qui est à mon avis daubée. Le 2° paramètre devrait être char const* argv[], mais si on est absolument 500% sûr que c'est un genre d'erreur historique et que les chaînes ne sont réellement pas modifiées, alors c'est un cas typique d'utilisation de const_cast. Et encore mieux je fournirais une fonction qui fait ça en interne.
    Sinon, et bien tu crées le paramètre comme attendu, lourd ou pas, t'as pas le choix.
    Pensez à consulter la FAQ ou les cours et tutoriels de la section C++.
    Un peu de programmation réseau ?
    Aucune aide via MP ne sera dispensée. Merci d'utiliser les forums prévus à cet effet.

  7. #7
    Responsable Systèmes


    Homme Profil pro
    Gestion de parcs informatique
    Inscrit en
    Août 2011
    Messages
    17 434
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Paris (Île de France)

    Informations professionnelles :
    Activité : Gestion de parcs informatique
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Août 2011
    Messages : 17 434
    Points : 43 065
    Points
    43 065
    Par défaut
    Déjà, n'utilises pas argv qui reçoit les arguments de ton programme courant. Créé une variable nommée arguments par exemple.

    Ensuite, strdup est une fonction C, y a t'il un équivalent C++ ? je ne sais pas, je ne fais pas de C++.
    Si c'est le cas, tu n'as pas à te préoccuper du free, car execv va écraser l'espace mémoire de ton processus par l’exécutable que tu appelles (enfin sauf si il y a une erreur d’exécution). A moins que tu n’exécutes la fonction exec dans un fork.
    Ma page sur developpez.com : http://chrtophe.developpez.com/ (avec mes articles)
    Mon article sur le P2V, mon article sur le cloud
    Consultez nos FAQ : Windows, Linux, Virtualisation

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

Discussions similaires

  1. commande find -exec fonction ?
    Par slig_80 dans le forum Shell et commandes GNU
    Réponses: 9
    Dernier message: 03/12/2010, 01h39
  2. [Système] Probleme de PATH avec la fonction exec
    Par Sylvain71 dans le forum Langage
    Réponses: 11
    Dernier message: 16/07/2006, 17h04
  3. [Système] problème avec la fonction exec
    Par SegmentationFault dans le forum Langage
    Réponses: 1
    Dernier message: 30/06/2006, 17h59
  4. [Système] Problème avec la fonction exec()
    Par ben_harper dans le forum Langage
    Réponses: 13
    Dernier message: 28/06/2006, 11h32
  5. [VISUAL 6] Fonction exec
    Par Nelmo dans le forum MFC
    Réponses: 2
    Dernier message: 04/06/2006, 23h01

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