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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    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
    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 confirmé
    Homme Profil pro
    Analyste/ Programmeur
    Inscrit en
    Juillet 2013
    Messages
    4 771
    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 771
    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 confirmé
    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
    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 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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 confirmé
    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
    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 153
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Canada

    Informations professionnelles :
    Activité : Network game programmer

    Informations forums :
    Inscription : Juin 2010
    Messages : 7 153
    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.

+ 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