Fork et execvp

fullpirates Messages postés 3 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 8 octobre 2007 - 8 oct. 2007 à 01:30
The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 - 8 oct. 2007 à 18:52
Bon je vous explique j'ai un travail de mi-session à remettre pour mercredi et j'ai essayer bien comme mal a faire fonctionner la commande execvp ... mais je crois que elle et moi on ne va pas ensemble puisqu'elle m'envoi toujours l'erreur errno = 10 ce qui signifie un problème de création du fils mais pourtant quand je passe à "la mitaine" ce qui veut dire que je met directement sans passer par des variables dans

char *parametre[20] = {"ps","-H",NULL};

execvp("ps",parametre);

*bien sur disposer dans les places approprier dans mon programmes ...
ceci marche !

mais quand je le remplace par le programme ci-dessous sa ne marche pas
je ne serait pas comment vous remercier si vous pouvez m'aider car hier jai tourner en rond de 12h a 24h et j'en suis rendu au meme point quand ce moment

#include
#include
#include <signal.h>
#include <errno.h>
#include <stdlib.h>
#include <wait.h>
#include <string.h>

void ctrlC ( int signal );

main ( int argc , char *argv [ ] )
{
   int vrpf = 1;
   int statut = -1;
   int retourExecl = 0;
   char commande [21];
   char argument[21];
   char *parametre[] = {commande, argument, NULL};
   bool quitter = false;
   int a = 0;
   int b = 0;
   int c = 0;

   system ( "clear" );
   cout << "Bienvenue dans le Marshell!" << endl;

   while ( strcmp ( commande , "exit" ) != 0 )
   {
      wait (&statut);
      statut /= 256;
      // signal ( SIGINT , ctrlC );
      strcpy ( commande , "" );
      cout << "\nMarshell>";
      cin.getline(commande, 21);
      retourExecl = 0;

      for( a = 0 ; commande[a] != ' ' ; a++);

      a++;

      for( b = 0 ; commande[a] != '\0' ; a++,b++)
      {
         *(parametre[1] + b) = commande[a];
         cout << *(parametre[1] + b) << endl;
         // argument[b] = commande[a];
      }
      commande[(a-b)] = '\0';
      *(parametre[1] + b) = '\0';
      *(parametre[0] + (a-b)) = '\0';
      //strcpy( commande, commande );
      //strcpy( argument, "-H" );
      cout << *(parametre[0] + 2) << endl;
      //char *parametre[] = {commande, argument, NULL};

      cout << commande[2] << endl;
      cout << *(parametre[1] + 2) << endl;
      // cout << argument << endl;
      if ( (vrpf fork ( ) ) 0 )
         retourExecl = execvp ( commande , parametre );
      else if ( vrpf < 0 )
         cout << "Erreur de création du fils." << endl;
      if ( vrpf > 0 || retourExecl == -1)
      {
      wait (&statut);
      cout << "exit : " << statut << endl;
      cout << "PID : " << getpid() << endl;
      }
      if ( retourExecl == -1 )
      {
         cout << "errno: " << errno << endl;
      }
   }
}

<!-- / message -->



Julien Cousineau

2 réponses

fullpirates Messages postés 3 Date d'inscription mardi 13 février 2007 Statut Membre Dernière intervention 8 octobre 2007
8 oct. 2007 à 02:01
Ah ! et en passsant quand je sort le execvp() du fils pour voir son erreur elle me donne l'erreur 2 qui no such file or directory mais pourtant quand j'affiche mes variables elle sont identiques à ce qui devrait être écrit dans ces variables puisque quand j'écrit directement dans execvp() se qui est dans mes variables sa marches ...

Merci encore !

Julien Cousineau
0
The_Guardian Messages postés 317 Date d'inscription vendredi 25 mai 2007 Statut Membre Dernière intervention 19 octobre 2007 1
8 oct. 2007 à 18:52
Bonjour,

y'a un problème avec la façon dont tu alloues ta variable parametre, donc commence avec une commande vide c'est mieux
char ** parametre;
 ensuite tu dois allouer parametre comme un tableau de char *
 donc la tu fais :
parametre = (char **)malloc(20*sizeof(char *));
pour allouer 20 arguments a ta commande (incluant la commande elle-meme et le NULL, bref pas 20 mais 18)
 ensuite tu fais
parametre[0] = "ps";
parametre[1] = "-aux";
parametre[2] = NULL;
ensuite je te conseille d'utiliser strcpy plutot que ta copie parce que ca complique la lecture et au final ça fait strcpy
Voila essaye ça et dis moi si ça marche

==

Une autruche ne se cuit pas aux petits lardons
0
Rejoignez-nous