IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

C Discussion :

Rediriger sortie standard


Sujet :

C

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 110
    Par défaut Rediriger sortie standard
    Bonjour à tous,

    je veux rediriger la sortie standard de mon programe vers un fichier mais il n'y a que certaines lignes qui sont redirigées.

    En effet, seul les lignes venant de mes commandes "exec" sont redirigés vers le fichier, les printf directement situés dans le code eux n'apparaissent pas.

    J'ai essayé ceci en début de main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    log_file = open("moniteur.log",O_WRONLY|O_APPEND,0777);
    	if(log_file == -1)
    	{
    		perror("Erreur lors de l'ouverture du fichier log\n");
    	}
    	else
    	{
    		dup2(log_file,1);
    		close(log_file);  
    	}
    J'ai également testé ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    freopen("moniteur.log","w", stdout);
    Et enfin j'ai essayé d'exécuter mon programme comme ceci :

    Toujours le même effet, seule les sorties de mes exec s'affiche.

    Merci d'avance

  2. #2
    Membre Expert Avatar de fregolo52
    Homme Profil pro
    Développeur C
    Inscrit en
    Août 2004
    Messages
    2 366
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Développeur C

    Informations forums :
    Inscription : Août 2004
    Messages : 2 366
    Par défaut
    je n'y connais pas grand chose mais dans ce topic, il n'y a pas de open avant le freopen.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 110
    Par défaut
    Bonjour, oui c'est une erreur quand j'ai recopié le code j'avais effectué le test mais j'ai oublié d'enlever la ligne. Merci de me l'avoir fait remarquer.

    Merci pour ton lien je vais essayer son code

    EDIT : ça ne fonctionne toujours pas

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Octobre 2009
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2009
    Messages : 110
    Par défaut
    Re-bonjour,

    voici mon main :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    int main(void)
    {	
     
    	int s=0;
    	int log_file;
     
    	struct sockaddr_in adresse;
    	adresse.sin_family = AF_INET;
    	adresse.sin_port = htons(3500);
    	adresse.sin_addr.s_addr=inet_addr("127.0.0.1");
     
    	int addr_size = sizeof(adresse);
     
    	socket_id = socket(AF_INET,SOCK_STREAM,0);
    	bind(socket_id, (struct sockaddr*) &adresse, addr_size);	
    	listen(socket_id, SOMAXCONN);
     
    	//Sortie standard vers fichier 
    	//--------------------------------
    	if(freopen("test.dat","w",stdout) == NULL)
    	{
    		perror("freopen");
    		exit(1);
    	}
     
    	fprintf(stdout,"Cette ligne doit se trouver dans le fichier \n");
     
     
     
    	//Ecoute de la socket
    	while(1)
    	{
    		s = accept(socket_id, (struct  sockaddr*)&adresse, &addr_size);
     
    		int p=fork();
    		if(p>0)
    		{
    			close(s);		
    		}	
    		else
    		{
    			traitement(s);
    		}               
     
    	}	
    }
    Si je commence toute la boucle while, alors tout se passe bien.
    Maintenant si je laisse le code tel quel, le fichier test.dat s'ouvre mais rien ne s'affiche dedans.

    Ce n'est pas normal ça si? il devrait quand même m'écrire "Cette ligne doit se trouver dans le fichier" comme la boucle arrive apres?

  5. #5
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Mai 2008
    Messages
    27 129
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : Mai 2008
    Messages : 27 129
    Billets dans le blog
    150
    Par défaut
    Et pourquoi ne pas utiliser un pipe pour rediriger quelque chose vers autre chose ?
    man pipe
    freopen pour faire ça me semble un peu bancal.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  6. #6
    Membre confirmé Avatar de ironzorg
    Profil pro
    Inscrit en
    Juillet 2006
    Messages
    288
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2006
    Messages : 288
    Par défaut
    Ce que dis mon man:

    The freopen() function opens the file whose name is the string pointed
    to by path and associates the stream pointed to by stream with it. The
    original stream (if it exists) is closed. The mode argument is used
    just as in the fopen() function. The primary use of the freopen()
    function is to change the file associated with a standard text stream
    (stderr, stdin, or stdout).
    Donc la fonction freopen est bel et bien appropriee pour rediriger l'output du programme vers le fichier.

    Apres:
    - Utilise des write(1, string, strlen(string)); pour output a la place des printf
    - Es tu sur que ce que les operations de ton binaire ne peuvent etre faites par un script ?

  7. #7
    Membre émérite Avatar de orfix
    Homme Profil pro
    Inscrit en
    Avril 2007
    Messages
    707
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Secteur : High Tech - Produits et services télécom et Internet

    Informations forums :
    Inscription : Avril 2007
    Messages : 707
    Par défaut
    Citation Envoyé par dvp_zero Voir le message
    Si je commence toute la boucle while, alors tout se passe bien.
    Maintenant si je laisse le code tel quel, le fichier test.dat s'ouvre mais rien ne s'affiche dedans.

    Ce n'est pas normal ça si? il devrait quand même m'écrire "Cette ligne doit se trouver dans le fichier" comme la boucle arrive apres?
    Je dirais que c'est tout à fait normale en voyant ceci :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    //Ecoute de la socket
    	while(1)
    	{
    	...
    	}
    Comment est-ce que tu arrêtes cette boucle ? très certainement en tuant le processus avec un bon vieux Ctrl+C
    Cela implique que ton programme se termine brutalement, sachant que les I/O sont bufferisées ton programme n'a pas le temps de vider ses tampons, en l'absence de cette boucle infinis tu n'as pas besoin de le tuer et tout vas pour le mieux. pour forcer le système a vider ses tampons place un fflush(stdout) juste après chaque fprintf()/printf()/...
    Certains diront que le \n est là pour ça, en effet mais qui nous dit que stdout dans ce cas précis est line buffered, bref tu peux aussi rajouter un appel à setvbuf() au tout début de ton programme avant toute opération d'I/O :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    setvbuf(stdout, NULL, _IOLBF, 0);

Discussions similaires

  1. rediriger la sortie standard d'eclipse dans un fichier
    Par christianf dans le forum Eclipse Java
    Réponses: 3
    Dernier message: 25/10/2007, 16h29
  2. sortie standard rediriger vers un fichier.
    Par cisqo dans le forum C
    Réponses: 3
    Dernier message: 22/06/2007, 18h13
  3. Rediriger une sortie standard vers le presse-papier du bureau
    Par Schmorgluck dans le forum Applications et environnements graphiques
    Réponses: 5
    Dernier message: 13/04/2007, 23h15
  4. Réponses: 2
    Dernier message: 22/05/2006, 11h02
  5. rediriger la sortie standard vers un textarea
    Par gromite dans le forum Composants
    Réponses: 9
    Dernier message: 10/05/2004, 11h07

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo