Rediriger un flux de sortie

Rediriger un flux de sortie - C - Programmation

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 :)
 

Reply

Marsh Posté le 02-09-2008 à 11:24:49   

Reply

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

Reply

Marsh Posté le 02-09-2008 à 11:41:07    

ou fais un popen

Reply

Marsh Posté le 02-09-2008 à 11:42:46    

Ah oui, exact  :o j'avais oublié le pipe.

Reply

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 :)

Reply

Marsh Posté le 03-09-2008 à 01:04:01    

xilebo a écrit :


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 :)

 

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 :/


Message édité par Gf4x3443 le 03-09-2008 à 01:06:04

---------------
Petit guide Kerberos pour l'administrateur pressé
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed