Probleme C / systeme LINUX

Signaler
Messages postés
6
Date d'inscription
mardi 15 mars 2011
Statut
Membre
Dernière intervention
16 mai 2011
-
Messages postés
6
Date d'inscription
mardi 15 mars 2011
Statut
Membre
Dernière intervention
16 mai 2011
-
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

Messages postés
1466
Date d'inscription
vendredi 2 janvier 2004
Statut
Modérateur
Dernière intervention
14 février 2014
1
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};

@++
Messages postés
6
Date d'inscription
mardi 15 mars 2011
Statut
Membre
Dernière intervention
16 mai 2011

je vais essayer ca tout de suite !!
merci du conseil !

a++