Linux - Redirection de la sortie vers un fichier

Linux - Redirection de la sortie vers un fichier - C - Programmation

Marsh Posté le 30-05-2006 à 18:57:27    

Slt,
 
J'ai un executable toto que j'ai compilé sous Linux. Ce programme contient pas mal d'appels à printf()
Je l'execute de la façon suivante :

# ./toto


Je vois défiler les différents messages (printf)
Ensuite je veux rediriger les messages du programme vers un fichier. Je l'execute de la façon suivante :

# ./toto > ./liste.txt


Les messages ne défilent plus. Le fichier liste.txt a bien été créé, mais il est systématiquement vide ?!?!?!?!?
 
Y aurait il une science de la redirection qui m'echappe sous Linux ? Un paramètre système pour la gestion des redirections ?  [:aztechxx]


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 30-05-2006 à 18:57:27   

Reply

Marsh Posté le 30-05-2006 à 19:37:50    

jipo a écrit :

Y aurait il une science de la redirection qui m'echappe sous Linux ?


Quel rapport avec le langage C ?
 
http://forum.hardware.fr/hardwaref [...] ujet-1.htm


Message édité par Emmanuel Delahaye le 30-05-2006 à 19:41:37

---------------
Des infos sur la programmation et le langage C: http://www.bien-programmer.fr Pas de Wi-Fi à la maison : http://www.cpl-france.org/
Reply

Marsh Posté le 30-05-2006 à 19:41:22    

Ca me semble vachement curieux ton problème.
En effet, sauf si ton prog contient un truc du style
 


#include <stdio.h>
#include <unistd.h>
#include <stdlib.h>
 
int main(void)
{
        if (isatty(1))
                puts("console" );
        else
                puts("tu sauras pas ce que j'écris" );
 
        exit(EXIT_SUCCESS);
}


 
je ne vois pas d'où ca pourrait venir.
Si c'était un problème de permission, tu ne pourrais pas créer le fichier.
Ton disque n'est pas plein?


Message édité par simple_stupid le 30-05-2006 à 22:19:14
Reply

Marsh Posté le 30-05-2006 à 23:47:33    

Non je suis root et c'est une machine de la mort qui tue l'espace ... sous RedHat 64 AS


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 31-05-2006 à 10:01:46    

./a.out | tee fichier
 
:o

Reply

Marsh Posté le 31-05-2006 à 10:20:26    

désolé Taz,
mais le fichier est bien créé mais vide ...  :??:


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 31-05-2006 à 10:47:39    

tee te permet juste de rediriger vers la console et un fichier, en même temps.
 
Compiler en root c'est mal.
 
Tu pourrais poster ton code ici? J'aimerais tester sur ma debian.

Reply

Marsh Posté le 31-05-2006 à 13:42:14    

En fait j'ai refait un test à partir d'un tout petit programme où il n'y a que 2 printf().
Et là cela fonctionne :

Code :
  1. # ./test > test.txt


renvoit bien les chaines generees par les printf dans le fichier.
 
Donc cela vient du programme que je maintiens. Ce programme s'appuie sur une interface XMotif. L'interface graphique empecherait-elle la redirection par un moyen ou un autre ? J'ai demandé des éclaircissements à mon client, j'attend ...
 
 


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 31-05-2006 à 13:52:34    

Je viens de trouver le pourquoi ....
 
Dans mon programme le main est écrit de la façon suivante :

Code :
  1. main(int argc,char *argv[])


 
Je l'ai modifié en :

Code :
  1. int main(int argc,char *argv[])


 
Et là la redirection fonctionne !  [:audi]  
 
Qqu'un pourrait me fournir une explication ?   :D
Je ne vois pas le rapport direct entre le fait que la fonction retourne int explicitement et la redirection ...


Message édité par jipo le 31-05-2006 à 13:54:07

---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 31-05-2006 à 14:06:52    

Ben non ... Ca n'a marché qu'une seule fois !  :fou:  :fou:  
et après toujours le meme probleme à nouveau


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 31-05-2006 à 14:06:52   

Reply

Marsh Posté le 31-05-2006 à 17:28:11    

Voilà ...
Cette fois j'ai trouvé : Mon programme quitte avec un _exit(0)
Je pense que les descripteurs de fichier sont fermés, mais que les écritures ne sont pas faites avant la fermeture ...
 
Quelqu'un peut il me confirmer cela, et m'indiquer une manière simple de mettre à jour un fichier de log si on quitte avec _exit() ou si le programme s'arrete sur une erreur ...
 
Merci


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 31-05-2006 à 17:49:06    

t'as fflush(stdout); à la fin ou pas ?


---------------
Me: Django Localization, Yogo Puzzle, Chrome Grapher, C++ Signals, Brainf*ck.
Reply

Marsh Posté le 31-05-2006 à 17:56:54    

NON
 
Mais même si je l'avais, si jamais le programme plante et part en segm fault, est-ce qu'il y a moyen de recuperer le log ?


---------------
"Comme des pommes d'or sur des ciselures d'argent, Ainsi est une parole dite à propos" (Proverbes de Salomon)
Reply

Marsh Posté le 31-05-2006 à 18:25:43    

y a des bibliotheques compeltes de log sur le web

Reply

Marsh Posté le 31-05-2006 à 18:37:34    

jipo a écrit :

Voilà ...
Cette fois j'ai trouvé : Mon programme quitte avec un _exit(0)
Je pense que les descripteurs de fichier sont fermés, mais que les écritures ne sont pas faites avant la fermeture ...
 
Quelqu'un peut il me confirmer cela, et m'indiquer une manière simple de mettre à jour un fichier de log si on quitte avec _exit() ou si le programme s'arrete sur une erreur ...
 
Merci


 
J'ai l'impression que ton code a été codé par des porcs.
Le fait d'appeller _exit() ne change rien.
Les descripteurs de fichier sont fermés, il devrait y avoir écriture.
 
T'as vérifié qu'il n'y avait pas un appel a isatty()?

Reply

Sujets relatifs:

Leave a Replay

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