Non non ce n’est pas de l’humour à deux sous, j’ai un problème pour utiliser les fonctions exec*.
L’idée c’est que j’ai un exo où on me demande de réécrire la fonction system(), utilisant une fonction de la familles des exec*. C’est intéressant mais je m’en sort pas. Je tiens à dire pour ceux qui aurais un doute que j’ai la correction du prof, donc ce n’est en aucun cas de la triche, je trouve juste sa solution pas génial.
Donc après mettre pris la tête avec des allocation dynamiques de mémoire pour aggrandir un tableau j’ai utilisé une string est un vector. Maintenant faut que j’arrive à correctement “transformer” mon vecteur de string en tableau de pointeurs de ntcts.
Voici ma fonction :
[code]namespace
{
typedef vector VStr;
typedef VStr::iterator ItVStr;
int System (const char * const Commande)
{
const int CmdSz = strlen(Commande);
VStr Argv;
bool Protect = false;
for (int i (0); i < CmdSz;)
{
string Str;
for(; i < CmdSz; ++i)
{
if (false == Protect && ' ' == Commande[i])
{
++i;
break;
}
if ('\'' == Commande[i] && '"' == Commande[i])
Protect = !Protect;
Str.push_back(Commande[i]);
}
if (!Str.empty())
Argv.push_back(Str);
}
cerr << "Taille de Argv : " << Argv.size() << endl;
char * args [Argv.size() + 1];
for (size_t i (0); i < Argv.size(); ++i)
{
//cout << Argv[i] << endl;
strcpy(args[i], Argv[i].c_str());
//cout << args[i] << endl;
}
args[Argv.size()] = 0;//static_cast<char*> (0);
for (size_t i (0); i < Argv.size(); ++i)
cout << args[i] << endl;
return execv(args[0], args);
} // System()
} // namespace[/code]
Quand je le lance avec “ls -l exo_04_2.cxx” ça fonctionne mais pas avec “ls exo_04_2.cxx” ni quand j’augmente le nombre d’arguments.
Je me retrouve soit avec une segfault soit avec un
Et franchement je vois pas pourquoi.