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

Réseau C Discussion :

read d'une fifo bloquante


Sujet :

Réseau C

  1. #1
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 71
    Points
    71
    Par défaut read d'une fifo bloquante
    salut tout le monde
    voila mon probleme, j'ai 2 process un serveur et un client (il peut y avoir plusieurs client) qui communiquent l'un par une fifo (du client au serveur) et l'autre par un message Q(du serveur au client). le serveur lui lit en boucle la fifo pour voir si rien ne se trouve dessus, et repond au client que si necessaire... le probleme est que lorsque je lis ma fifo lors de la lecture si il ya qq chose dans ma fifo tout vas bien, mais si il n'y a rien dedans c'est comme si mon process 'server' était gélé jusqu'a ce qu'il yait qq chsoe dedans :s.

    C'est qq voit ou est mon probleme qu'il parle car la je retourne encore la question et je vois pas :s

    je laisse une partie de mon code coté server au cas ou ...


    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
    47
    48
    49
    50
    51
    52
    53
    54
    55
          /******************SET FIFO******************************************/ 	if(mkfifo(PATH_FIFO,0777)<0){ 		if(errno!=EEXIST){ 			perror("Erreur mkfifo"); 			exit(EXIT_FAILURE); 		}else{ 			perror("fifo already exists, but show must go on :p"); 		} 	} 	printf("jouvre la fifo qui se trouve %s\n", PATH_FIFO); 	if((fifo=open(PATH_FIFO,O_RDONLY))<0){ 		perror("Erreur open"); 		exit(EXIT_FAILURE); 	} 	printf("fifo ouverte en read\n"); 	 /****************ON COMMENCE LA PARTIE ICI******************************/	 	jeux=0; 	joueurCourant=-1; 	joue=0; 	while(1){ 		int nbcar=0; 		if(jeux==0 && nombre_de->joueur==5){ 			printf("la partie débute\n"); 			jeux=1; 		}  		if(jeux==0 && nombre_de->joueur>=2  && nombre_de->joueur<5){ 			printf("Dans 30sec on démarre la partie si ya pas dautre inscription\n"); 			alarm(30); 		}  		if(jeux==1 && joue==0){ 			joueurCourant = (joueurCourant+1)%nombre_de->joueur; 			msgMQ->pid=tabPid[joueurCourant]; 			msgMQ->type = 'J'; 			joue=1; 			if(msgsnd(msgq_id,msgMQ,sizeof(struct msgMQ),IPC_NOWAIT)<0){ 				perror("Erreur msgsnd"); 				exit(EXIT_FAILURE); 			} 			printf("prochain joueur %d\n",tabPid[joueurCourant]); 			kill(tabPid[joueurCourant],SIGUSR1); 		}
    /*c'est ici que ca foire **/ 
                    :mouarf:if((nbcar=read(fifo,sonMsg,sizeof(struct msgFifo))) <=0){
    			continue;
    		}
    
    		if(sonMsg->type=='I'){
    			if(nombre_de->joueur<6 && jeux==0){
    				printf("Oh on doit inscrire quelqu un\n");
    				printf("nom : %s, prenom : %s, pid %d\n",sonMsg->nom,sonMsg->prenom,sonMsg->pid);
    				strcpy(joueurs->tabJoueur[nombre_de->joueur].nom,sonMsg->nom);
    				strcpy(joueurs->tabJoueur[nombre_de->joueur].prenom,sonMsg->prenom);
    				tabPid[nombre_de->joueur]=sonMsg->pid;
    				printf("SERVER a inscrit : %s %s\n", joueurs->tabJoueur[nombre_de->joueur].nom, joueurs->tabJoueur[nombre_de->joueur].prenom);
    				nombre_de->joueur++;
    				
    				msgMQ->pid = sonMsg->pid;
    				msgMQ->type = 'O';
    				msgMQ->numJoueur = nombre_de->joueur;
    				
    
    				if(msgsnd(msgq_id,msgMQ,sizeof(struct msgMQ),IPC_NOWAIT)<0){
    					perror("Erreur msgsnd");
    					exit(EXIT_FAILURE);
    				}
    				kill(sonMsg->pid,SIGUSR1);
    			}else{
    				msgMQ->pid = sonMsg->pid;
    				msgMQ->type = 'K';
    				if(msgsnd(msgq_id,msgMQ,sizeof(struct msgMQ),IPC_NOWAIT)<0){
    					perror("Erreur msgsnd");
    					exit(EXIT_FAILURE);
    				}
    				kill(sonMsg->pid,SIGUSR1);
    			}			
    		}
    		if(sonMsg->type=='P'){
    			printf("Oh c'est une proposition\n");
            	}
    		printf("il y a %d joueur\n",nombre_de->joueur);
    	}
    	printf("SERVER CLOSING\n");
    	if(close(fifo)<0){
    		perror("Erreur close");
    		exit(EXIT_FAILURE);
    	}
    	shmdt(repartition);
    	shmdt(nombre_de);
     	shmdt(joueurs);
    	delmem(shm_id_nbr_nbj);
    	delmem(shm_id_repart);
    	delmem(shm_id_joueur);
    	exit(0);
    }

  2. #2
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Je pense que ta fonction "read" est bloquante.
    Regarde plutôt du côté de la fonction "select"
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

  3. #3
    Membre régulier
    Inscrit en
    Novembre 2005
    Messages
    110
    Détails du profil
    Informations forums :
    Inscription : Novembre 2005
    Messages : 110
    Points : 71
    Points
    71
    Par défaut
    oui c'est juste, je viens de remarqué aussi :s, mais alors ca explique pas mon autre probleme, lorsque je fais un write du coté du client, on dirait que le serveur ne le catch pas, alors que le read si c'est bien comme tu dis qu'il est bloquant

  4. #4
    Membre habitué Avatar de BigNic
    Profil pro
    Inscrit en
    Décembre 2004
    Messages
    195
    Détails du profil
    Informations personnelles :
    Localisation : France, Paris (Île de France)

    Informations forums :
    Inscription : Décembre 2004
    Messages : 195
    Points : 154
    Points
    154
    Par défaut
    Citation Envoyé par crocodilex
    Je pense que ta fonction "read" est bloquante.
    Regarde plutôt du côté de la fonction "select"
    je ne comprend pas bien, je pensais que c'était plutot le contraire.
    Select reste bloquée tant qu'il n'y a pas de données à lire (ou possibilité d'écrire). On peut toutefois la faire sortir sur timeout.

    read lit, et s'il n'y a rien à lire elle sort et indique qu'il n'y a rien à lire.

    donc select est bloquante et read non.

  5. #5
    Membre éclairé Avatar de crocodilex
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    697
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mars 2006
    Messages : 697
    Points : 858
    Points
    858
    Par défaut
    Citation Envoyé par BigNic
    je ne comprend pas bien, je pensais que c'était plutot le contraire.
    Select reste bloquée tant qu'il n'y a pas de données à lire (ou possibilité d'écrire). On peut toutefois la faire sortir sur timeout.

    read lit, et s'il n'y a rien à lire elle sort et indique qu'il n'y a rien à lire.

    donc select est bloquante et read non.
    Eh bien en fait, pour la fonction read, tout dépend du driver de ton device. La plupart des devices te donnent la possibilité de faire des accès bloquants ou non bloquants. En général cela se configure par un "ioctl" (cf. doc driver). Par défaut ils sont bloquants, ce qui est le cas des sockets.
    Concernant la fonction select, l'interet c'est le timeout. Après tout dépend ce que tu veux faire.
    Software Failure. Press left mouse button to continue.
    Guru Meditation #0100000C.000FE800

Discussions similaires

  1. problème de fifo bloquant sous linux
    Par Fonzy007 dans le forum POSIX
    Réponses: 6
    Dernier message: 20/05/2009, 09h44
  2. Quelques tests sur une FIFO
    Par mrttlemonde dans le forum Linux
    Réponses: 2
    Dernier message: 07/06/2006, 17h52
  3. Ouvrir une fenetre bloquante
    Par Cooly dans le forum C++Builder
    Réponses: 9
    Dernier message: 10/01/2005, 18h50
  4. [Threads] Sortir d'une fonction bloquante
    Par guejo dans le forum MFC
    Réponses: 19
    Dernier message: 17/08/2004, 14h12
  5. [C#] ouvrir une fenetre "bloquante"
    Par Johan31 dans le forum ASP.NET
    Réponses: 6
    Dernier message: 26/02/2004, 11h48

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