Rediriger un flux de sortie - C - Programmation
Marsh Posté le 02-09-2008 à 11:32:49
normalement, tu dois pouvoir récupérer les flu de sortie de B sans rajouter de code dedans via des redirections d'entrées sorties. Jette un coup d'oeil du côté des pipes
Marsh Posté le 02-09-2008 à 11:45:17
Taz a écrit : ou fais un popen |
Je vais regarder si je peux exploiter la commande popen, actuellement je fais un fork() puis un execlp() derrière. Merci de l'info, je ne connaissais pas cette fonction
Marsh Posté le 03-09-2008 à 01:04:01
xilebo a écrit :
|
Tu ne fais rien "a priori" dans B (du moins après le exec. Avant, oui).
Grosso merdo:
- tu crées une pipe
- tu fais un fork() pour créer un nouveau processus (les descripteurs sont hérités)
- suivant ce que tu veux faire (stdout de A vers stdin de B ou stdout de B vers stdin de A), tu close() un des deux bouts de la pipe (un bout dans le fils, un bout dans le père)
- tu as maintenant une pipe unidirectionnelle propre
- tu utilises dup2() (et pas dup(), vu que tu ne controles pas quel descripteur sera retourné via dup) pour remplacer les ressources pointées par les filedes de stdin/stdout par ceux de ta pipe
- tu closes les filedes de la pipe
- tu execve ton processus fils
Popen fait grosso modo la même chose, à ceci près que certaines implémentations utilisent des socket plutot que des pipe, et que popen permet de faire du bidirectionnel (tandis qu'une pipe, non).
Edit: à vérifier, toutes les implémentations de popen ne font pas du bidirectionnel
Marsh Posté le 02-09-2008 à 11:24:49
Bonjour,
J'ai 2 applications A et B, B étant lancé par A via un fork(). B génère des logs sur stdout (printf etc...) et j'aimerai les récupérer dans mon application A. Je pense qu'il faut que j'utilise les fonctions close() dup() etc... pour rediriger le descripteur de fichier stdout de B, mais je n'arrive pas à voir comment procéder. J'aimerai dans l'idéal appeler une callback (avec en paramètre la chaine de caractère) à chaque fois que B génère un log. Est-ce possible ?
Si c'est possible (ce que je suppose) puis-je effectuer l'opération de A uniquement, ou ai-je besoin d'écrire du code du coté de B ?
Merci d'avance