Ecriture dans un fichier

Ecriture dans un fichier - C - Programmation

Marsh Posté le 31-12-2008 à 01:51:19    

Bonjour ou plutôt bonsoir vu l'heure.
 
En vue du titre, mon problème peut sembler anodin.
 
Mon problème est le suivant :
 
Je dois écrire dans un fichier le résultat d'un exec(). Or après l'appel à un exec la fonction est terminé.
Donc pour pouvoir écrire ailleurs que dans la sortie standard (stdout) il faut la fermer et ouvrir un autre canal.
Pour cela, j'ai pensé à ouvrir mon fichier avec un fopen("filename","w" ) mais le problème est que fopen est une fonction de haut niveau qui renvoie un FILE* et non pas un file descriptor, donc je ne peux pas faire de dup(fopen("filename","w" )).
 
Ma question est la suivante :
 
Existe-t-il un moyen de récupérer le file descriptor d'un FILE* ? ou peut-on remplacer stdout par un fopen?
 
Dans le cas d'une incompréhension dans mon problème, chose qui est très probable, n'existez pas à me demander de plus ample information.
 
Merci.

Reply

Marsh Posté le 31-12-2008 à 01:51:19   

Reply

Marsh Posté le 31-12-2008 à 05:17:16    

shino332 a écrit :


Je dois écrire dans un fichier le résultat d'un exec(). Or après l'appel à un exec la fonction est terminé.

 

Pas vraiment, le contexte est détruit. La fonction ne retourne jamais. exec() est un appel système qui remplace l'image d'un executable par un autre. Si tu veux enregistrer le stdout() d'un processus, il faut faire un pipe, fork() puis exec(), ou utiliser des fonctions comme popen() (qui font la même chose, en moins souple).

 
Citation :

Donc pour pouvoir écrire ailleurs que dans la sortie standard (stdout) il faut la fermer et ouvrir un autre canal.

 

Pas forcément, tu peux obtenir un fds via un open(), et utiliser dup2() pour remplacer le fds stdout par celui-ci. Les cas les plus courants ou on ferme stdout, c'est pour les daemons. dup2() fermera le précédent fds pour toi.

 
Citation :

Pour cela, j'ai pensé à ouvrir mon fichier avec un fopen("filename","w" ) mais le problème est que fopen est une fonction de haut niveau qui renvoie un FILE* et non pas un file descriptor, donc je ne peux pas faire de dup(fopen("filename","w" ))

 

Ma question est la suivante :

 

Existe-t-il un moyen de récupérer le file descriptor d'un FILE* ?

 

fileno()

 
Citation :

ou peut-on remplacer stdout par un fopen?

 

Non, pour le controle des I/O, c'est la table des descripteurs de fichier qui prime, vu que c'est elle qui contient les pointeurs vers les ressources (écran, clavier, ligne, socket, whatever).


Message édité par Gf4x3443 le 31-12-2008 à 05:27:25

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

Marsh Posté le 31-12-2008 à 13:18:00    

Pour écrire dans le fichier, mon idée était d'ouvrir le fichier et remplacer stdout par le fd du fichier ouvert afin que exec écrive dans le fichier directement au lieu d'écrire dans stdout.
J'étais tellement absorbé par fopen que j'en avais oublié que open(pathname,flags) existait ou du moins me donnait ce que je voulais ...
Pour résoudre mon problème je procède comme suit :

Code :
  1. fclose(stdout);
  2. dup(open(cmd->suivant->argv[0],O_RDONLY | O_CREAT));
  3. execvp(cmd->argv[0],cmd->argv);


 
Avec cette structure pour cmd :
 

Code :
  1. typedef struct Cmd
  2. {
  3. int argc;
  4. char** argv;
  5. char sym;
  6. struct Cmd* suivant;
  7. }* Cmd;


 
Cette solution semble fonctionner. Si vous avez des critiques, je suis tout ouïe.

Reply

Marsh Posté le 31-12-2008 à 13:57:30    

Presque rien à dire. Je recommande quand même d'utiliser dup2() plutot que dup(), qui permet de controler le numéro du file descriptor (dup() retourne le plus bas non utilisé, ce qui est pas très commode quand on cherche à faire des redirections, en particulier si le programme est utilisé via un shell qui va fermer certains fds prématurément avec [<>]&- ).
 
Après, les bonnes pratiques veulent que l'on controle toujours les valeurs de retour des appels systèmes, ca évite beaucoup de déconvenues le jour ou on veut faire tourner son code ailleurs.


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

Marsh Posté le 31-12-2008 à 14:30:25    

En faite, le programme est censé être un shell donc les fermetures sont contrôlés. Néanmoins, c'est vrai qu'il est plus sur d'utiliser dup2, chose que j'ai remplacé. Les contrôles des valeurs retour aux appels systèmes sont fait dans mon code, je ne l'ai avait pas mit pour ne pas "encombrer" le post.
Merci bien de ton aide.

Reply

Sujets relatifs:

Leave a Replay

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