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 :

Problème de lecture avec mknod


Sujet :

C

  1. #1
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2011
    Messages : 14
    Par défaut Problème de lecture avec mknod
    Bonjour, j'ai utilisé un tube nommé le problème est qu'il semblerait que rien ne soit lu

    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
    #include<unistd.h>
    #include<sys/types.h>
    #include<sys/stat.h>
    #include<fcntl.h>
    #include <string.h>
    #include <stdlib.h>
    #include <stdio.h>
     
     
    main(int argc,char *argv[])
    {
    	int filedes;
    	char inbuf[512];
    	char outbuf[512];
     
    	printf("Texte\n");	
    	char text[200];
    	scanf("%s",text);
     
    	printf("Ouverture\n");
    	filedes=open("verseruveur",O_RDWR);
    	if(filedes==-1)
    	{
    		printf("erreur ouverture en ecriture: open \n");
    		exit(1);
    	}
    	strncpy(outbuf,text,sizeof(outbuf));
    	printf("Ecriture\n");
    	write(filedes, outbuf, sizeof(outbuf));
    	printf("message ecrit: %s\n",inbuf);
    	printf("Lecture\n");
     
    	read(filedes, inbuf, sizeof(inbuf));
    	printf("message lu: %s\n",inbuf);
    	close(filedes);
    	exit(0);
    }
    Lorsque je tape hello:

    Texte
    hello
    Ouverture
    Ecriture
    message ecrit: hello
    Lecture
    message lu:

  2. #2
    Expert confirmé
    Avatar de fred1599
    Homme Profil pro
    Lead Dev Python
    Inscrit en
    Juillet 2006
    Messages
    4 069
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Meurthe et Moselle (Lorraine)

    Informations professionnelles :
    Activité : Lead Dev Python
    Secteur : Arts - Culture

    Informations forums :
    Inscription : Juillet 2006
    Messages : 4 069
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    write(filedes, outbuf, sizeof(outbuf));
    printf("message ecrit: %s\n",inbuf);
    Il n'y aurait pas quelque chose de bizarre là?

    Sinon relis la page de man de read et de write, ils renvoient tous deux quelque chose.

  3. #3
    Membre averti
    Homme Profil pro
    Étudiant
    Inscrit en
    Décembre 2011
    Messages
    14
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Décembre 2011
    Messages : 14
    Par défaut
    oui pardon du coup c'est outbuf

    Mais j'ai toujours le même problème

  4. #4
    Modérateur
    Avatar de Obsidian
    Homme Profil pro
    Chercheur d'emploi
    Inscrit en
    Septembre 2007
    Messages
    7 487
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 49
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Chercheur d'emploi
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : Septembre 2007
    Messages : 7 487
    Par défaut
    Bonjour,

    Le principe du tube est d'avoir deux extrémités, et donc deux descripteurs différents : l'un ouvert en lecture, l'autre en écriture. Lorsque tu utilises pipe(), on te demande de passer l'adresse d'un tableau de deux entiers pour que l'appel en question puisse te renvoyer ces deux descripteurs en même temps.

    Lorsque l'on utilise un tube nommé, c'est encore plus flagrant puisqu'ils sont justement faits pour permettre à deux processus complètement indépendants d'entrer en relation par l'intermédiaire de ce « point de rendez-vous ».

    Tu peux bien sur exploiter ton tube nommé dans le même programme, mais il te faut donc ouvrir deux fichiers.

  5. #5
    Membre prolifique
    Avatar de Sve@r
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    Février 2006
    Messages
    12 840
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Oise (Picardie)

    Informations professionnelles :
    Activité : Ingénieur développement logiciels
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Février 2006
    Messages : 12 840
    Billets dans le blog
    1
    Par défaut
    Citation Envoyé par kolarium Voir le message
    oui pardon du coup c'est outbuf

    Mais j'ai toujours le même problème
    Citation Envoyé par Obsidian Voir le message
    Tu peux bien sur exploiter ton tube nommé dans le même programme, mais il te faut donc ouvrir deux fichiers.
    Bonjour

    Pour continuer dans la même logique que le message d'Obsidian, le problème de cette méthode est que le noyau Unix bloque tout processus d'écriture tant qu'il n'y a pas un processus de lecture mis en place de l'autre coté (et pareil pour un processus de lecture qui ne serait pas équilibré par un processus d'écriture correspondant). Il s'agit bien d'un "point de rendez-vous" comme l'a dit Obsidian...

    Et donc si tu veux utiliser le tube dans un même programme, une procédure basique de ce type
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    ouvrir(tube, "w")
    écrire(tube)
    fermer(tube)
    ouvrir(tube, "r")
    lire(tube)
    fermer(tube)
    Ne pourra pas fonctionner car ton programme sera bloqué à "écrire(tube)". Tu es obligé, pour exploiter ton tube, d'avoir 2 processus tournant en parallèles ; l'un des deux écrivant tandis que l'autre lis le tube.

    Ces deux processus peuvent être écrits dans deux programmes séparés ; ou bien dans un même programme qui les génère via un fork()...
    Mon Tutoriel sur la programmation «Python»
    Mon Tutoriel sur la programmation «Shell»
    Sinon il y en a pleins d'autres. N'oubliez pas non plus les différentes faq disponibles sur ce site
    Et on poste ses codes entre balises [code] et [/code]

Discussions similaires

  1. Réponses: 2
    Dernier message: 11/05/2010, 09h27
  2. Problème de lecture avec les Socket
    Par Kevin12 dans le forum Entrée/Sortie
    Réponses: 2
    Dernier message: 18/03/2009, 15h40
  3. Problème de lecture avec un player audio ouvert par SWFobject
    Par ceddus dans le forum Balisage (X)HTML et validation W3C
    Réponses: 2
    Dernier message: 21/06/2007, 04h47
  4. [DEBUTANT] Problème de lecture avec un fscanf
    Par Pingouin dans le forum C
    Réponses: 26
    Dernier message: 28/05/2006, 18h10
  5. [DOM] Problème de lecture avec DOM
    Par samios dans le forum Format d'échange (XML, JSON...)
    Réponses: 5
    Dernier message: 29/09/2004, 15h58

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