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

  1. #1
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 5
    Points : 1
    Points
    1
    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 expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    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 : 543
    Points : 1 745
    Points
    1 745
    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
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 5
    Points : 1
    Points
    1
    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
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    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
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 5
    Points : 1
    Points
    1
    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
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    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 : 543
    Points : 1 745
    Points
    1 745
    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
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    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.

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

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 5
    Points : 1
    Points
    1
    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??

  9. #9
    Nouveau Candidat au Club
    Homme Profil pro
    Étudiant
    Inscrit en
    Février 2016
    Messages
    5
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Bouches du Rhône (Provence Alpes Côte d'Azur)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Février 2016
    Messages : 5
    Points : 1
    Points
    1
    Par défaut
    Citation Envoyé par Médinoc Voir le message
    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...


    Je ne savais pas que scanf renvoyais une valeur!!

    Je lis le man scanf et je vois "These functions return the number of input items assigned" donc si je comprends bien l'afficher lorsqu'elle est différente de 1 sert à vérifier que la lecture s'est bien déroulée?
    et comment cette valeur pourrait-elle être négative??

    Merci pour ton aide!

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

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

    Informations forums :
    Inscription : Septembre 2005
    Messages : 27 369
    Points : 41 519
    Points
    41 519
    Par défaut
    En fait, je ne sais plus si elle peut vraiment l'être. Et je n'ai pas moyen de vérifier facilement à l'instant, je suis sur smartphone.
    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.

  11. #11
    Expert confirmé
    Inscrit en
    Mars 2005
    Messages
    1 431
    Détails du profil
    Informations forums :
    Inscription : Mars 2005
    Messages : 1 431
    Points : 4 182
    Points
    4 182
    Par défaut
    scanf return value:
    Number of receiving arguments successfully assigned, or EOF if read failure occurs before the first receiving argument was assigned.

  12. #12
    Membre expérimenté
    Avatar de sambia39
    Homme Profil pro
    No Comment
    Inscrit en
    Mai 2010
    Messages
    543
    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 : 543
    Points : 1 745
    Points
    1 745
    Par défaut
    Citation Envoyé par Mr.Floppy Voir le message
    Sambia : super, cela fonctionne avec votre code (j'ai utilisé les 2 premiers car je ne connais pas execs...) Merci pour votre aide!

    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??
    Avez-vous pris la peine de lire le troisième code sources?.
    Si vous avez pris le temps de lire le troisième code sources, vous remarquerez que c'est exactement la portion du code qui se trouve dans l'exemple avec la création d'un processus fils et ceux afin de vous montrer que l'on peut ce passé de la création d'un processus fils ( une manière astucieuse si je peux dire). J'admets qu'il peut y avoir une erreur de saisie, mais copier collé sans comprendre, c'est très très^3 dangereux surtout que vous preniez même pas le temps de lire et comprendre le code source, mais aussi les remarques qui vous ont été faites et vues la réponse que vous avez fournie, on peut dire que pour le moment certaines notions élémentaires que vous avez abordé sont partiellement floues pour vous.
    Prenez le temps de lire et comprendre les choses
    Confucius à dit "Apprendre sans réfléchir est vain. Réfléchir sans apprendre est dangereux.”
    à bientôt
    Celui qui peut, agit. Celui qui ne peut pas, enseigne.
    Il y a deux sortes de savants: les spécialistes, qui connaissent tout sur rien,
    et les philosophes, qui ne connaissent rien sur tout.
    George Bernard Shaw

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