Probleme C / systeme LINUX

cs_elite182 Messages postés 6 Date d'inscription mardi 15 mars 2011 Statut Membre Dernière intervention 16 mai 2011 - 5 mai 2011 à 14:30
cs_elite182 Messages postés 6 Date d'inscription mardi 15 mars 2011 Statut Membre Dernière intervention 16 mai 2011 - 7 mai 2011 à 19:48
Bonjour a tous !!

Je rencontre actuellement un probleme sur le C.

Comme vous me l'avez explique la derniere fois en cours, j'ai obtenu un pointeur de pointeur de caractere , me permettant de stocker dans un tableau chaque argument de la ligne de commande taper par l'utilisateur de mon "mini_shell".

Je souhaitrais realiser une fonction qui me renvoit toujours un pointeur de pointeur de caractere pour pouvoir " redecouper " la ligne de commande saisie.

ex : ps -L | wc -L

je souhaiterai que ma fonction me renvoi simplement par exemple : ps -L

Pour cela , j'ai utiliser realloc, mais d'apres les sources d'internet , il est source de nombreux probleme.

Ma fonction ne plante pas a la compilation , mais lors de l'execution celle-ci renvoi une erreur incomprehensible...

Je voudrais savoir ce que vous me conseillez pour la realisation de cette fonction.

Voici ma fonction :
char ** renvoi_cmd( char ** tab , int Recup_Cmd )
{
// pour la comparaison avec l'argument '|'
char pipe[3] = { '|','\0'};
int commande = 0;

char **buf = NULL;
int taille = 0;
int cpt = 0 ;

//Tant que je n'ai pas parcouru tout mon tableau...
while(tab[cpt] != NULL)
{
// si le carractere courant est un pipee...
if(strcmp(tab[cpt],pipe) == 0)
{
commande ++ ; 


if(commande == Recup_Cmd)// Si il s'agit de la commande que nous voulons extraire...
{
while(strcmp(tab[cpt],pipe) != 0) // et tant que nous ne rencontrons pas le prochain pipe...
{
char **tmp;
    					++taille;
    					tmp = realloc(buf, taille);
if(tmp != NULL)
{ 
     						buf = tmp;
    						// on ajoute l'argument 
      						buf[taille - 1] = tab[cpt];
    					} 
else
{
       						 fprintf(stderr, "error realloc... IN === > " Renvoi_cmd" \n");
exit(42);
   					}
cpt++;
}
// Ajout du caractere de fin du tableau "NULL"
char **tmp2;
    				++taille;
    				tmp2 = realloc(buf, taille);
if(tmp2 != NULL)
{ 
     					buf = tmp2;
    					// on ajoute le caractère 
      					buf[taille - 1] = NULL;
    				} 
else
{
       					 fprintf(stderr, "error realloc... IN === > " Renvoi_cmd" \n");
exit(42);
   				}
cpt++;
}
}

// Si la commande souhaitée est la premiere...
if(commande == Recup_Cmd)
{

while(strcmp(tab[cpt],pipe) != 0) // IDEM QUE CI-DESSUS
{
char **tmp;
    				++taille;
    				tmp = realloc(buf, taille);
if(tmp != NULL)
{ 
     					buf = tmp;
    					/* on ajoute l'argument */
      					buf[taille - 1] = tab[cpt];
    				} 
else
{
       					fprintf(stderr, "error realloc... IN === > " Renvoi_cmd" \n");
exit(42);
   				}
cpt++;
}
buf[taille] = NULL ;
}
cpt++;
  		
    		
}
return buf;
}



Merci par avance.

2 réponses

cs_patatalo Messages postés 1466 Date d'inscription vendredi 2 janvier 2004 Statut Modérateur Dernière intervention 14 février 2014 2
5 mai 2011 à 18:30
salut,

J'aurais plutôt commencé par parser les pipes avant de parser les commandes.

char *cmdline = "ps -L | wc -L";
char **cmds = { "ps -L", "|", "wc -L", NULL };
char **cmd = {"ps","-L",NULL};

@++
0
cs_elite182 Messages postés 6 Date d'inscription mardi 15 mars 2011 Statut Membre Dernière intervention 16 mai 2011
7 mai 2011 à 19:48
je vais essayer ca tout de suite !!
merci du conseil !

a++
0
Rejoignez-nous