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 :

Problème avec utilisation de execv


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 5
    Par défaut Problème avec utilisation de execv
    Bonjour à tous,

    Voilà mon problème:

    J'ai un programme très simple qui fonctionne très bien :

    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
     
    int main(int argc, const char * argv[])
    {
        int choix;
     
        while (1)
        {
            printf("\nEntrez votre choix\n");
            scanf("%d",&choix);
            switch (choix)
            {
                case 1:
     
                    printf("\nCas 1\n\n");
                    break;
     
                case 2:
     
                    printf("\nCas2\n\n");
                    break;
     
                default:
                    break;
            }
        }
    }

    Mon problème est que dès que je l'execute par le biais d'un execv, la console m'affiche "entrez votre choix " en boucle à l'infini....

    Par avance merci!

  2. #2
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonsoir
    Ce n'est pas parce que votre programme fonctionne en saisissant des chiffres que le programme est correct.
    Penché vous en détaille sur votre code vous remarquerez des erreurs.
    Pour commencez, je vois une boucle infinie en clair votre programme ne s'arrête jamais deuxième point si l'on fait une erreur de saisie (admettant" que l'on tape "&" au lieu de 1 ) c'est la panique le programme s'affole.
    Sécurisé votre saisie avant pour éviter des surprises.
    Quant à l'erreur utilisant les primitives comment avez-vous implémenté le code.
    Si possible pourriez-vous nous fournir le code ?

    à bientôt

  3. #3
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 5
    Par défaut
    Bonsoir,

    Merci pour votre aide, j'ai modifié mon code de manière à empêcher le programme de planter lors d'une saisie erronée :

    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
     
    int main(int argc, const char * argv[])
    {
        char choix;
     
        while (1)
        {
            printf("\nEntrez votre choix\n");
            scanf("%s",&choix);
            switch (choix)
            {
                case '1':
     
                    printf("\nCas 1\n\n");
                    break;
     
                case '2':
     
                    printf("\nCas2\n\n");
                    break;
     
                default:
                    break;
            }
        }
    }
    Malheureusement, ca n'a pas résolu mon problème, en fait mon code final ne ressemble pas à ca , je l'ai simplifié au maximum pour essayer de cibler l'erreur. C'est pour cela que j'en suis arrivé à un code aussi simple ( et qui ne sert à rien en l'état d'ailleurs!! ).
    Ce que je voudrais c'est exectuer ce programme par le biais d'un execv dans un autre programme dont voici le 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
     
    int main(int argc, char* argv[])
    {
        int Planete1;
     
        char *chaine1[5]= {"/Users/christophe/projets/CellWars/testFork/prog", "5","5", NULL};
     
        Planete1=fork();
        if(Planete1==0)
        {
                sleep(1);
                execv("/Users/christophe/projets/CellWars/testFork/prog",chaine1);     // programme à executer
        }
     
        wait(&Planete1);
        exit(0);
        }

  4. #4
    Membre Expert
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Par défaut
    Ce n'est pas le même programme puisque celui présenté ne traite pas ses arguments. Quel est le programme initial ?

  5. #5
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 5
    Par défaut
    Citation Envoyé par Matt_Houston Voir le message
    Ce n'est pas le même programme puisque celui présenté ne traite pas ses arguments. Quel est le programme initial ?
    Les 2 programmes sont tels que présentés, le premier programme fonctionne lorsqu'il est appelé seul mais pas lorsqu'il est appelé par le second(par le execv).

    J'ai essayé de supprimer les chiffres passés en paramètres, et le problème reste le même.

  6. #6
    Expert éminent
    Avatar de Médinoc
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Septembre 2005
    Messages
    27 393
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 41
    Localisation : France

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 393
    Par défaut
    Citation Envoyé par Mr.Floppy Voir le message
    Les 2 programmes sont tels que présentés, le premier programme fonctionne lorsqu'il est appelé seul mais pas lorsqu'il est appelé par le second(par le execv).

    J'ai essayé de supprimer les chiffres passés en paramètres, et le problème reste le même.
    Et si pour commencer, tu prenais en compte la valeur retournée par scanf()?
    L'afficher quand elle est différente de 1 serait un bon début.
    Quitter la boucle quand elle est négative serait une bonne suite.

    Et même ça ne suffit pas: Il faut finir de lire la ligne, car si scanf("%d") tombe sur un caractère non-numérique, il ne le consommera pas et le caractère sera encore là pour le prochain appel de scanf("%d"), puis le suivant...
    SVP, pas de questions techniques par MP. Surtout si je ne vous ai jamais parlé avant.

    "Aw, come on, who would be so stupid as to insert a cast to make an error go away without actually fixing the error?"
    Apparently everyone.
    -- Raymond Chen.
    Traduction obligatoire: "Oh, voyons, qui serait assez stupide pour mettre un cast pour faire disparaitre un message d'erreur sans vraiment corriger l'erreur?" - Apparemment, tout le monde. -- Raymond Chen.

  7. #7
    Membre très actif
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    548
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Loiret (Centre)

    Informations professionnelles :
    Activité : No Comment
    Secteur : High Tech - Matériel informatique

    Informations forums :
    Inscription : Mai 2010
    Messages : 548
    Par défaut
    Bonjour
    Citation Envoyé par Matt_Houston Voir le message
    Ce n'est pas le même programme puisque celui présenté ne traite pas ses arguments. Quel est le programme initial ?
    Effectivement, de plus il n'y a eu aucune modification, et si je peux me le permettre pourquoi utilisé des primitives ou un "fork" pour un programme qui ne nécessite pas l'utilisation de ces différente routine. Qu'est-ce qui justifie ce choix ? (sans oublier que l'on n'a pas vraiment le code d'origine qui génère l'anomalie en question.)
    En attendant j'ai pris la peine d'apporter quelques modifications pour affirmer ce que j'ai énoncé dans mon premier poste mais attention, les codes source que je poste peut comporter des erreurs.

    • Le code source du choix sans execv et fork

      Code C : 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
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
      59
      60
      61
      62
      63
      64
      65
      66
      67
      68
      69
      70
      71
      72
      73
      74
      75
      76
      77
      78
      79
      80
      81
      82
      83
      84
      85
      86
      87
      88
      89
      90
      91
      92
      93
      94
      95
      96
       
      /*
      *  File: source.c
      *  Version: 0.0.1 GPL V3.
      *  Created by SAMBIA39 on 19/02/2016 - 9:34:46.
      *  Copyright (c) 2016 SAMBIA39 and DEVELOPPEZ.NET
      */ 
      #include <stdio.h>
      #include <stdlib.h>
       
      //type booléen
      typedef enum e_bool{
          false,
          true
      }bool;
       
      /*
       *  Fonction qui joue similaire à perror 
       */
      void f_fatal_err( char *p_msg ){
          extern int errno;
          extern const int sys_nerr;
          extern const char *const sys_errlist[];
       
          fprintf( stderr, "Erreur N°(%d)\t\t:%s\n", errno, p_msg );
          if( 0 < errno && sys_nerr > errno )
              fprintf( stderr, "Description erreur\t:%s\n", sys_errlist[errno] );
          else
              fprintf( stderr, "Description erreur\t:Erreur inconnue\n" );
       
          exit( EXIT_FAILURE );
      }
       
      /*  
      *   Fonction qui se charge de prendre la saisie 
      *   et vider le buffer elle renvoie vrais si 
      *   la saisie a été correcte faut en cas d'erreur
      */
      bool f_get_choix( char *ptr, size_t buff ){
       
          char *p_str = NULL;
          register int c_str;
          extern char *strchr();
          buff = ( 0 >= buff ) ? BUFSIZ : buff;
       
          fgets( ptr, buff, stdin );
          if( NULL != (p_str = strchr( ptr, '\n' ) ) )
              *p_str = '\0';
          else{
              do{
                  c_str = getchar();
              }while( '\n' != c_str && EOF != c_str );
              return false;
          }
          return true;
      }
       
      /*
       *  Fonction principale
       */
      int main( void ){
       
          int choix;
          char ptr[BUFSIZ];
          short i_bool = 1;
          extern int errno;
       
          while ( i_bool )
          {
              printf("\nEntrez votre choix\n");
              if( false == f_get_choix( ptr, BUFSIZ ) )
                  f_fatal_err( "Saisie incorrecte" );
              sscanf(ptr, "%d", &choix);
              switch (choix)
              {
                  case 1:
       
                      printf("\nCas 1\n\n");
                      break;
       
                  case 2:
       
                      printf("\nCas2\n\n");
                      break;
                  case 3:
                      i_bool = 0;
                      break;
                  default:
                      fprintf( stdout, "Commande invalide\n" );
                      break;
              }
          }
       
          fprintf( stdout, "Fin du programme\n" );
          return EXIT_SUCCESS;
      }
    • Le code source du avec fork et execv

      Code C : 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
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
      45
      46
      47
      48
      49
      50
      51
      52
      53
      54
      55
      56
      57
      58
       
      /*
      *  File: source.c
      *  Version: 0.0.1 GPL V3.
      *  Created by SAMBIA39 on 19/02/2016 - 10:15:46.
      *  Copyright (c) 2016 SAMBIA39 and DEVELOPPEZ.NET
      */ 
       
      #include <stdio.h>
      #include <stdlib.h>
       
      /*
       *  Fonction qui joue similaire à perror 
       */
      void f_fatal_err( char *p_msg ){
          extern int errno;
          extern const int sys_nerr;
          extern const char *const sys_errlist[];
       
          fprintf( stderr, "Erreur N°(%d)\t\t:%s\n", errno, p_msg );
          if( 0 < errno && sys_nerr > errno )
              fprintf( stderr, "Description erreur\t:%s\n", sys_errlist[errno] );
          else
              fprintf( stderr, "Description erreur\t:Erreur inconnue\n" );
       
          exit( EXIT_FAILURE );
      }
       
      /*
       *  Fonction principale
       */
      int main(int argc, char *argv[]) {
       
          pid_t i_wait;
          pid_t i_fork;
       
          extern int errno;
          extern int wait();
          extern int execv();
          extern pid_t fork();
       
          errno = 0;
          switch ( i_fork = fork() ){
              case -1:
                  f_fatal_err("Erreur fork");
      	break;
      	case 0:
                  if( -1 == execv( "dev_test", argv) )
      		f_fatal_err("Execution du programme");
                  break;
      	default:
                  if( -1 == wait( &i_wait) )
      		f_fatal_err("Erreur fork");
                  break;
          }
       
          return EXIT_SUCCESS;
      }
    • Le code source execs

      Code C : 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
      30
      31
      32
      33
      34
      35
      36
      37
      38
      39
      40
      41
      42
      43
      44
       
      /*
      *  File: source.c
      *  Version: 0.0.1 GPL V3.
      *  Created by SAMBIA39 on 19/02/2016 - 10:15:46.
      *  Copyright (c) 2016 SAMBIA39 and DEVELOPPEZ.NET
      */ 
       
      #include <stdio.h>
      #include <stdlib.h>
       
      /*
       *  Fonction qui joue similaire à perror 
       */
      void f_fatal_err( char *p_msg ){
          extern int errno;
          extern const int sys_nerr;
          extern const char *const sys_errlist[];
       
          fprintf( stderr, "Erreur N°(%d)\t\t:%s\n", errno, p_msg );
          if( 0 < errno && sys_nerr > errno )
              fprintf( stderr, "Description erreur\t:%s\n", sys_errlist[errno] );
          else
              fprintf( stderr, "Description erreur\t:Erreur inconnue\n" );
       
          exit( EXIT_FAILURE );
      }
       
      /*
       *  Fonction principale
       */
      int main(int argc, char *argv[]) {
       
       
          extern int errno;
          extern int execv();
       
          errno = 0;
          if( -1 == execv( "dev_test", argv) )
      	f_fatal_err("Execution du programme");
          fprintf( stdout, "Fin de programme\n" );
       
          return EXIT_SUCCESS;
      }


    Pour la suite c'est à vous de voir
    à bientôt

  8. #8
    Membre à l'essai
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 5
    Par défaut
    Sambia : super, cela fonctionne avec votre code (j'ai utilisé les 2 premiers car je ne connais pas execs...) Merci pour votre aide!


    Citation Envoyé par sambia39 Voir le message
    (sans oublier que l'on n'a pas vraiment le code d'origine qui génère l'anomalie en question.)
    Si si vous l'avez ! les 2 programmes de mon précédent post génèrent l'anomalie en question

    Je suppose donc que mon problème vient du fait que je n'ai pas géré les erreurs possibles lors de la saisie du choix??

Discussions similaires

  1. Problème avec utilisation de ComPortLib + Arduino
    Par fab56 dans le forum API, COM et SDKs
    Réponses: 3
    Dernier message: 27/02/2014, 16h03
  2. [XL-2003] Problème avec utilisation d'une fonction dans les formules
    Par damsmut dans le forum Macros et VBA Excel
    Réponses: 2
    Dernier message: 29/05/2009, 10h43
  3. problème avec utilisation de cryptAPI
    Par ironboy007 dans le forum Bibliothèques
    Réponses: 0
    Dernier message: 23/04/2009, 14h25
  4. probléme avec utilisation de deux tables
    Par lila23 dans le forum Bases de données
    Réponses: 3
    Dernier message: 04/02/2009, 13h26
  5. [Compiler] Problème avec utilisation du MCR
    Par Death83 dans le forum MATLAB
    Réponses: 8
    Dernier message: 30/10/2007, 12h59

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