Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1608 connectés 

  FORUM HardWare.fr
  Programmation
  C

  Ecriture dans un fichier

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Ecriture dans un fichier

n°1832717
shino332
Posté le 31-12-2008 à 01:51:19  profilanswer
 

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.

mood
Publicité
Posté le 31-12-2008 à 01:51:19  profilanswer
 

n°1832724
Gf4x3443
Killing perfection
Posté le 31-12-2008 à 05:17:16  profilanswer
 

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é
n°1832821
shino332
Posté le 31-12-2008 à 13:18:00  profilanswer
 

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.

n°1832840
Gf4x3443
Killing perfection
Posté le 31-12-2008 à 13:57:30  profilanswer
 

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é
n°1832859
shino332
Posté le 31-12-2008 à 14:30:25  profilanswer
 

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.


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  C

  Ecriture dans un fichier

 

Sujets relatifs
Ecriture de log et accès simultané au fichierlecture et écriture dans un fichier texte en vbs
creation et ecriture dans un fichier en CLecture / écriture fichier *.ini en C
Lecture/Ecriture fichier texte vs MySQL ?[PHP] problème d'écriture dans un fichier
Ecriture dans un fichier ExcelApplication quitte sans avoir fermé un fichier ouvert en écriture
[PHP] problème lecture / écriture dans un fichierEcriture dans un fichier txt à partir d'une Procédure Stockée ?
Plus de sujets relatifs à : Ecriture dans un fichier


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR