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

Linux Discussion :

Les tubes en C


Sujet :

Linux

  1. #1
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 84
    Points : 58
    Points
    58
    Par défaut Les tubes en C
    Bonjour,
    J'ai un programme qui écrit le chiffre "2" dans un tube nommé :
    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
     
    int afficher(int message)
    {
     
    	FILE *fp;
    	int nb_elem;
     
    	fp=fopen("tube", "w");
    	if (fp == NULL) 
    	{
    		printf("erreur ouverture\n");
    		return -1;
    	}
     
    	nb_elem=fwrite(&message, sizeof(int), 1, fp);
    	if (nb_elem != 1) printf("erreur d'écriture");
     
    	fclose(fp); 
    }
     
    int main(void)
    {
    	int a;
    	a=afficher(2);
     
    	return 1;
    }
    Et un autre programme qui lit :
    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
    int main ()
    {
     
    	FILE *fp;
    	int i=1,a=0;
    	int nb_elem;
     
    	fp=fopen("tube", "r" );
    	if (fp == NULL) printf("erreur d'ouverture");
     
    	//while(1)
    	//{
    		nb_elem=fread(&i, sizeof(int), 1, fp);
     
    		if (nb_elem == -1) printf("erreur de lecture");	
    		if (i != 1) 
    		{
    			printf("%d",i);
    			i=1;
     
    		}
     
    	//}
    	fclose(fp);
    	return 1;
    }
    Mon problème : Si je vire le While, ça marche (mon terminal de réception affiche bien "2"), et si je ne le vire pas, ça ne marche pas (il n'affiche rien et reste bloqué). Pourquoi ?

    Merci de votre aide, je suis vraiment perdu là :/

  2. #2
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Pourquoi il reste bloqué ? Et bien parce qu'a cause du while tu boucles sur une deuxième lecture, qui reste bloquée parce qu'il n'y a plus rien à lire. Et ça n'affiche rien parce que la première lecture se passe bien (ben oui ça arrive, des fois), et que donc i vaut donc 1.

  3. #3
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 84
    Points : 58
    Points
    58
    Par défaut
    Justement, si la 1ère lecture se passait bien il m'afficherait la valeur de i, or il ne le fait pas.
    De plus quand j'envoie des valeurs au tube (différentes de 1) il ne m'affiche rien non plus. Je sais pas pourquoi ça bloque...

  4. #4
    Membre expérimenté
    Avatar de muad'dib
    Homme Profil pro
    Développeur Java
    Inscrit en
    Janvier 2003
    Messages
    1 013
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 43
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Java
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Janvier 2003
    Messages : 1 013
    Points : 1 381
    Points
    1 381
    Par défaut
    Il faut réouvrir le tube à chaque lecture via fopen car les changements effectués ne sont pas chargés automatiquement. fopen garde le contenu du fichier en mémoire.

  5. #5
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Citation Envoyé par Jerepain Voir le message
    Justement, si la 1ère lecture se passait bien il m'afficherait la valeur de i, or il ne le fait pas.
    De plus quand j'envoie des valeurs au tube (différentes de 1) il ne m'affiche rien non plus. Je sais pas pourquoi ça bloque...
    Quand tu l'as lu, i vaut 1... Et s'il vaut 1 tu ne l'affiche pas...

    Sinon effectivement tu peux avoir des problèmes de bufferisation, mais qui n'ont rien à voir avec fopen. C'est le fwrite qui peut poser problème. Deux solutions (il y en a d'autres) : dans le process qui écrit les données, tu peux passer en écriture non bufferisée avec setbuf(fp, NULL). Ou alors, après ton fwrite(), tu peux forcer l'écriture avec un fflush(fp).

  6. #6
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 304
    Points : 4 971
    Points
    4 971
    Billets dans le blog
    5
    Par défaut
    Je me mêle surement de ce qui ne me regarde pas mais un printf sans un retour chariot n'affiche rien dans la console tant que le processus n'est pas terminé. Un petit "/n" pourrait finalement résoudre pas mal de problèmes.

    Enfin ce que j'en dis ....

  7. #7
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Je me mêle surement de ce qui ne me regarde pas mais un printf sans un retour chariot n'affiche rien dans la console tant que le processus n'est pas terminé.
    Sauf si on a fait setbuf(fd, NULL), ou si on fait un fflush(fd) après le fprintf...

  8. #8
    Membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    84
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 84
    Points : 58
    Points
    58
    Par défaut
    Citation Envoyé par gerald3d Voir le message
    Je me mêle surement de ce qui ne me regarde pas mais un printf sans un retour chariot n'affiche rien dans la console tant que le processus n'est pas terminé. Un petit "/n" pourrait finalement résoudre pas mal de problèmes.

    Enfin ce que j'en dis ....
    C'était ça, merci

  9. #9
    Expert confirmé
    Avatar de gerald3d
    Homme Profil pro
    Conducteur de train
    Inscrit en
    Février 2008
    Messages
    2 304
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 54
    Localisation : France, Côte d'Or (Bourgogne)

    Informations professionnelles :
    Activité : Conducteur de train
    Secteur : Transports

    Informations forums :
    Inscription : Février 2008
    Messages : 2 304
    Points : 4 971
    Points
    4 971
    Billets dans le blog
    5
    Par défaut
    De rien

  10. #10
    Membre émérite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Octobre 2008
    Messages
    1 515
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 46
    Localisation : France

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

    Informations forums :
    Inscription : Octobre 2008
    Messages : 1 515
    Points : 2 505
    Points
    2 505
    Par défaut
    Le bonne solution c'est d'écrire ce que tu dois écrire, puis de flusher. Ecrire un "\n" en plus juste pour l'effet de bord c'est crade. Enfin ce que j'en dis...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Les tubes (pipes)
    Par winux32 dans le forum Windows
    Réponses: 3
    Dernier message: 21/04/2008, 09h22
  2. LES TUBES (Pipe)
    Par ould64 dans le forum Linux
    Réponses: 2
    Dernier message: 19/04/2008, 16h36
  3. les tubes en c++
    Par kobton dans le forum C++
    Réponses: 5
    Dernier message: 24/03/2008, 13h05
  4. Réponses: 5
    Dernier message: 05/01/2007, 22h26
  5. Probleme avec les tubes
    Par L4BiN dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 28/07/2006, 11h44

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