Comment replacer la sortie standard sur l'écran ?

Comment replacer la sortie standard sur l'écran ? - C - Programmation

Marsh Posté le 04-03-2008 à 22:31:05    

Bonjour,
 
dans le cadre de réalisation d'un mini shell, je dois pouvoir modifier le descripteur de la sortie, erreur et entrée standard.
Mon problème est identique dans les trois cas. Prenons par exemple la sortie standard. J'arrive à la redirigier, mais une fois mon traitement achevé, comment la refaire aller sur l'écran ?
 
J'ai trouvé un code classique pour la rediriger :
 

Code :
  1. int fdesc;   /* descripteur d'entrée/sorties pour les redirections */
  2. int result;   /* résultat pour la duplication des E/S */
  3. fdesc = open("FichierPourLaSortie", O_CREAT | O_TRUNC | O_WRONLY, 0644);
  4. result = dup2(fdesc, STDOUT_FILENO); /* modifie la sortie standard */
  5. if(result < 0) {
  6.  fprintf(stderr, "erreur lors de la redirection de stdout. Arrêt de la commande.\n" );
  7.  return -1;
  8. }
  9. close(fdesc); /* ferme le descripteur inutilisé */
  10. /* ici je peux m'amuser à écrire dans FichierPourLaSortie */
  11. /* une fois mon traitement terminé, comment retrouvé stdout sur l'écran ?? */
  12. fflush(NULL);


Message édité par abaddon2002 le 04-03-2008 à 22:40:33
Reply

Marsh Posté le 04-03-2008 à 22:31:05   

Reply

Marsh Posté le 04-03-2008 à 23:02:15    

Je crois avoir trouvé une solution, mais je ne sais pas si c'est propre ?
 

Code :
  1. int fdesc;   /* descripteur d'entrée/sorties pour les redirections */
  2. int result;   /* résultat pour la duplication des E/S */
  3. int saveDesc[3]; /* sauvegarde de descripteur [0] pour l'entrée [1] pour la sortie [2] pour l'erreur */
  4. saveDesc[1] = dup(STDOUT_FILENO);
  5. fdesc = open("FichierPourLaSortie", O_CREAT | O_TRUNC | O_WRONLY, 0644);
  6. result = dup2(fdesc, STDOUT_FILENO); /* modifie la sortie standard */
  7. if(result < 0) {
  8.  fprintf(stderr, "erreur lors de la redirection de stdout. Arrêt de la commande.\n" );
  9.  return -1;
  10. }
  11. close(fdesc); /* ferme le descripteur inutilisé */
  12. /* je m'amuse ici */
  13. /* une fois terminé je fais cela : */
  14. fflush(NULL); /* vide les buffers */
  15. dup2(saveDesc[1], STDOUT_FILENO);
  16. close(saveDesc[1]);


Message édité par abaddon2002 le 04-03-2008 à 23:02:52
Reply

Marsh Posté le 05-03-2008 à 11:45:38    

euh je comprends pas ce que tu veux faire: tu fork, tu changes stdin, stdout, etc comme tu veux, tu exec et basta. Ca n'impacte pas les descripteurs de ton shell.

Reply

Marsh Posté le 05-03-2008 à 18:43:39    

Salut, euh si ça a un impacte sur mon shell. Mon shell c'est mon programme en C que je suis entrain de coder. En fait je voudrais changer les descripteurs du processus fils uniquement, là ma solution est plus "brutale" car elle change aussi celle du père. c'est pour ça que lorsque j'exécutais une commande, à son retour, le descripteur stdout restait dans le fichier. Ma solution proposée rétabli ce problème.
 
Mais ma question est : comment ne changer que les descripteurs du fils ?

Reply

Marsh Posté le 06-03-2008 à 09:40:02    

abaddon2002 a écrit :

Mais ma question est : comment ne changer que les descripteurs du fils ?


Et bien tu fais le changement dans le fils :pt1cable:

Reply

Marsh Posté le 06-03-2008 à 11:40:12    

abaddon2002 a écrit :

Salut, euh si ça a un impacte sur mon shell. Mon shell c'est mon programme en C que je suis entrain de coder. En fait je voudrais changer les descripteurs du processus fils uniquement, là ma solution est plus "brutale" car elle change aussi celle du père. c'est pour ça que lorsque j'exécutais une commande, à son retour, le descripteur stdout restait dans le fichier. Ma solution proposée rétabli ce problème.
 
Mais ma question est : comment ne changer que les descripteurs du fils ?


bah tu forks

Reply

Sujets relatifs:

Leave a Replay

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