[C] Redirection des E/S standard

Redirection des E/S standard [C] - C++ - Programmation

Marsh Posté le 25-11-2002 à 14:10:21    

Comment faire pour rediriger les entrées/sorties standard en C (sous Unix)?

Reply

Marsh Posté le 25-11-2002 à 14:10:21   

Reply

Marsh Posté le 25-11-2002 à 14:12:58    

man freopen
 
 
exemple:
 
FILE *file_handle=freopen("log", "w", stderr);


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 25-11-2002 à 14:13:07    

man close
man dup
man open

Reply

Marsh Posté le 25-11-2002 à 14:21:14    

lorill a écrit a écrit :

man close
man dup
man open




 
si c'est faisable en C standard, autant le faire avec les fonctions standard. Moi je n'utilises l'API C de Linux que lorsqu'il le faut.
 
d'autant plus que le type opaque FILE* offre un plus grand niveau d'abstraction que les descripteurs de fichiers et permet des entrées sorties avancées.
 
j'hesite pas a jongler entre les deux à l'aide de fileno
 
d'autant que certaines fonctions de l'API manipule aussi des FILE* (cf. popen)


---------------
du bon usage de rand [C] / [C++]
Reply

Marsh Posté le 04-02-2003 à 20:20:48    

Je dois rediriger les sorties std et err vers des sockets (par le biais d'un write (read par un autre poste). Comment faire?

Reply

Marsh Posté le 04-02-2003 à 20:39:37    

lorill a écrit :

man close
man dup
man open

:pfff: ce qui peut etre fait en C standard doit etre fait en C standard, qui fournit je le rappelle des e/s bufferisées via le type opaque FILE*

Reply

Marsh Posté le 04-02-2003 à 20:42:25    

++Taz a écrit :

:pfff: ce qui peut etre fait en C standard doit etre fait en C standard, qui fournit je le rappelle des e/s bufferisées via le type opaque FILE*


oui, mais si il doit rediriger vers des sockets, c'est open/dup/close qu'il lui faut

Reply

Marsh Posté le 04-02-2003 à 20:46:05    

meme pas fait gaffe que j'avais déjà posté ici. c'est quoi ce vieux topic?

Reply

Marsh Posté le 05-02-2003 à 12:20:35    

C'est bon, j'ai utilisé dup pour rediriger les sorties vers mon socket. Comment faire pour que les résultats soient affichés à l'écran du client?

Reply

Marsh Posté le 05-02-2003 à 12:29:35    

ben la meme manipulation avec stdout

Reply

Marsh Posté le 05-02-2003 à 12:29:35   

Reply

Marsh Posté le 05-02-2003 à 12:35:28    

J'utilise aussi dup pour rediriger le socket vers les stderr et stdout?

Reply

Marsh Posté le 05-02-2003 à 12:41:18    

ben oui

Reply

Marsh Posté le 05-02-2003 à 12:45:06    

J'ai toujours des read/write pour passer les commandes du client vers le serveur... ça ne posera pas des problèmes au milieur des dup? ou alors je fais la même chose avec des dup pour les stdin?

Reply

Marsh Posté le 06-02-2003 à 14:37:40    

J'ai fait cela du coté serveur:

Code :
  1. int fdstderr, fdstdout;
  2. fdstdout = dup(1);
  3. fdstderr = dup(2);
  4. //...
  5. dup2(socket, 1);
  6. dup2(socket, 2);
  7. //...
  8. read(...);
  9. //...
  10. // puis je ferme le socket et restaure les stdout et stderr
  11. // et je ferme les fdstderr et fdstdout à la fin
  12. //...


 
Mais je n'arrive pas a récupérer les résultats du coté client...
Coté client, j'envoir des commandes via un write. Ces commandes sont executées sur le serveur et les sorties stdout et stderr sont redirigées vers le socket. Le problème est que je n'arrive pas a récupérer ces résultats à partir du client pour les afficher à l'écran...

Reply

Marsh Posté le 08-02-2003 à 19:24:11    

UP

Reply

Marsh Posté le 09-02-2003 à 16:30:35    

Personne n'a une idée?
Je fais un read?

Reply

Marsh Posté le 09-02-2003 à 17:25:07    

C'est bon, ça fonctionne. Juste un petit problème, ça plante quand STDOUT et STDERR sont vides... le read du client doit attendre qque chose et bloque tout... comment faire pour empêcher ce genre de chose?

Reply

Sujets relatifs:

Leave a Replay

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