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]