C++ system() et shell

Hello

Je voudrai me bricoler un petit menu en console fait en c++, plutôt que de me taper toute les doc de chaque api,j’utilise system();
aux quelle je passe les valeurs voulue , l’idée serai donc aux moins de recevoir les résulta dans celle ci…

donc comment faire pour récuprer les information retournée.

merci d’avance

Pour mémoire, un process en console dispose de 3 flux : stdin, stdout, stderr. La méthode exacte à utiliser va dépendre des flux du process enfant auxquels tu as besoin d’accéder.

Méthode popen :

Avantage : très simple à utiliser, cf. man 3 popen
Inconvénient : tu ne peux accéder qu’à stdin ou stdout, pas les deux à la fois, et en aucun cas à stderr sauf si la commande que tu exécutes contient une redirection 2>&1 (auquel cas tu ne pourras pas distinguer entre stdout et stderr, les deux seront “mélangés” dans le flux que tu reçois).

Exemple là : pubs.opengroup.org/onlinepubs/00 … popen.html

Méthode pipe + fork :

Avantage : contrairement à popen, on peut accéder indépendamment à stdin, stdout, et stderr de la commande exécutée.
Inconvénient : c’est vachement plus compliqué, et accessoirement je ne connais que le principe (jamais eu besoin de le faire).

L’idée c’est de créer des pipes pour chaque flux auquel tu veux pouvoir accéder, forker le process, fermer les pipes inutiles dans les deux process, rattacher (dupliquer) les pipes à stdin/out/err dans le process enfant puis faire un exec, et lire/écrire sur les pipes dans le process parent. Plus facile à dire qu’à faire…

Exemple là (pseudo-code) : linuxquestions.org/questions … ow-201083/
Comme tu peux le voir c’est de l’artillerie lourde (il faut bien penser à toute la gestion d’erreur), mais ça a l’avantage d’être une solution complète qui te permet de gérer les 3 flux indépendamment.

À toi de voir ce qui te convient le mieux en fonction de tes besoins…

merci, popen fera l’affaire :slightly_smiling: :023