R�cup�rer le r�sultat d'une commande syst�me en c++
Bonjour
En C++, je cherche � r�cup�rer le r�sultat d'une commande syst�me afin de l'exploiter dans la suite de mon programme, prenons par exemple la commande "uname".
Pour des raisons de s�curit� et de robustesse je ne veux pas faire quelque chose du style
system("uname > fichier") et lire le fichier.
De m�me la commande dup2 qui permet de rediriger la sortie standard ne fonctionne qu'avec des handles de fichier pas avec des stream C++.
J'ai essay� en vain de r�diriger la sortie standard vers un stream en utilisant les m�thodes system et fork / execl /execlp mais �a ne fait qu'afficher le r�sultat de la commande sur la sortie standard et mon flot est toujours vide :
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22
| std::ostringstream oss;
int kidstatus, deadpid;
pid_t kidpid = fork();
if (kidpid == -1) {
std::cerr << "fork error " << errno << ", "
<< std::strerror(errno) << "\n";
return 1;
}
if (kidpid == 0) {
oss << execl("/usr/bin/uname","uname", 0); // affiche SunOS
return 0;
}
// we only get here if we're the parent process.
deadpid = waitpid(kidpid, &kidstatus, 0);
if (deadpid == -1) {
std::cerr << "waitpid error " << errno << ", "
<< std::strerror(errno) << "\n";
return 1;
}
std::cout << "child result code: " << WEXITSTATUS(kidstatus)
cout << "oss.str()=" << oss.str() << endl; |
Une suggestion??
Merci!!
c'est bien �a! ... un exemple d'utilisation
super c'est bien �a que je cherchais :)) merci beaucoup
pour info voil� comment �a peut s'utiliser
Code:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17
| char cmd[20] = "uname";
char buf1[BUFSIZ]; //BUFSIZ est une constante connue du système
FILE *ptr;
if ((ptr = popen(cmd, "r")) != NULL)
{
while (fgets(buf1, BUFSIZ, ptr) != NULL)
{
(void) printf("%s", buf1);
}
pclose(ptr);
}
else
{
fprintf(stderr, "Echec de popen\n");
exit(1);
} |
[Balises CODE rajout�es par Loulou24, merci d'y penser � l'avenir]