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 :

Utilisation des files de messages


Sujet :

Linux

  1. #1
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut Utilisation des files de messages
    Bonjour je cherche a faire deux programme pour gérer un aéroport.
    Le premier demande à un utilisateur d'ajouter un avion que j'envoie au deuxième programme à l'aide des files de messages.

    Dans le programme qui reçoit les messages, je souhaite les ajouter dans un tableau dans le but de faire un compte à rebours pour gérer le décollage de ces différents avions mais je rencontre un problème lors de la copie des char envoyés.

    Voici le morceaux de code ou je copie les char dans le tableau :

    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
     
    while(1)
    	{
    		 recoit.num[0] = '0';
     
     
    		 for(j = 0; j <= file_attente.msg_qnum; j++)
    		 {
                             message = msgget(cle, IPC_CREAT | 0666);
    		         receive = msgrcv(message, &recoit, sizeof(recoit), recoit.mtype, IPC_NOWAIT);
    		         msgctl(message, IPC_STAT, &file_attente);
    			 switch (recoit.num[0])
    			 {
    				case '1' : strcpy(tab[j][0], "Airbus 340");break;
    				case '2' : strcpy(tab[j][0], "Boeing 747");break;
    				case '3' : strcpy(tab[j][0], "Fokker");break;
    				case '4' : strcpy(tab[j][0], "Embraer Brasilia");break;
    				case '5' : strcpy(tab[j][0], "Jet Stream");break;
    			 }
    			 switch (recoit.num[1])
    			 {
    				case '1' : strcpy(tab[j][1], "Air France");break;
    				case '2' : strcpy(tab[j][1], "Ryan Air");break;
    				case '3' : strcpy(tab[j][1], "American Airlines");break;
    				case '4' : strcpy(tab[j][1], "Air Canada");break;
    				case '5' : strcpy(tab[j][1], "Japan air");break;
    			 }
    		 }
    Je reçoit une erreur de segmentation lors de la copie.
    tab est déclaré de la manière suivante : char tab[20][2][20];

  2. #2
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    pas de problème dans les strcpy, quelle ligne le SIGSEV ?

    vérifie que tu dépasses pas tes 20 entrées dans ta valeur de j finale


    edit: je m'étais perdu

  3. #3
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Merci d'avoir répondu si rapidement.

    Non je ne dépasse pas 20 avec j.
    Je te met tout le code ca pourra peut être t'aider, personnellement je ne sais plus quoi faire.

    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
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
     
    #include<sys/types.h>
    #include<stdio.h>
    #include<stdlib.h>
    #include<sys/msg.h>
    #include<sys/ipc.h>
    #include <string.h>
     
     
    int main()
    {
    //-----------------------------------------------------------------------------------------------//
    	struct msgbuf_user1
    	{
    		long mtype;
    		char num[5];
    		int num_comp;
    	};
     
    	key_t cle;
    	int message, receive, nb_mess, temp_attente, i, j;
    	char tab[6][2][20];
    	char recep[20][2][20];
     
    	strcpy(tab[0][0], "Airbus 340");
    	strcpy(tab[1][0], "Boeing 747");
    	strcpy(tab[2][0], "Fokker");
    	strcpy(tab[3][0], "Embraer Brasilia");
    	strcpy(tab[4][0], "Jet Stream");
    	strcpy(tab[0][1], "Air France");
    	strcpy(tab[1][1], "Ryan Air");
    	strcpy(tab[2][1], "American Airlines");
    	strcpy(tab[3][1], "Air Canada");
    	strcpy(tab[4][1], "Japan air");
     
    	struct msqid_ds file_attente;
    	struct msgbuf_user1 recoit;
     
    //-----------------------------------------------------------------------------------------------//
     
    	cle = ftok("/home/botzung/Cours/Unix/IPC/sem12",12345);
    	if(cle == -1) 
    	{                 
            	printf("Problème de cle\n");  
    		sleep(5);  
           		exit(-1);                
        	}
    	else
    		printf("\nCle : %x\n", cle);
     
    //-----------------------------------------------------------------------------------------------//
     
    	while(1)
    	{
    		 recoit.num[0] = '0';
    		for(j = 0; j <= file_attente.msg_qnum; j++)
    		 {
    		 	 message = msgget(cle, IPC_CREAT | 0666);
    		 	 receive = msgrcv(message, &recoit, sizeof(recoit), recoit.mtype, IPC_NOWAIT);
    		 	 msgctl(message, IPC_STAT, &file_attente);		 
     
    			 switch (recoit.num[0])
    			 {
    				case '1' : strcpy(recep[j][0], tab[0][0]);break;
    				case '2' : strcpy(recep[j][0], tab[1][0]);break;
    				case '3' : strcpy(recep[j][0], tab[2][0]);break;
    				case '4' : strcpy(recep[j][0], tab[3][0]);break;
    				case '5' : strcpy(recep[j][0], tab[4][0]);break;
    			 }
    			 switch (recoit.num[1])
    			 {
    				case '1' : strcpy(recep[j][1], tab[0][1]);break;
    				case '2' : strcpy(recep[j][1], tab[1][1]);break;
    				case '3' : strcpy(recep[j][1], tab[2][1]);break;
    				case '4' : strcpy(recep[j][1], tab[3][1]);break;
    				case '5' : strcpy(recep[j][1], tab[4][1]);break;
    			 }
    		 }
     
    		 if(recoit.num[0] != '0')
    		 {
    			printf("Id du message : %d\n\n", message);
    			switch (recoit.num[0])
    			{
    				case '1' : printf("Avion ajouter : Airbus 340\n");break;
    				case '2' : printf("Avion ajouter : Boeing 747\n");break;
    				case '3' : printf("Avion ajouter : Fokker\n");break;
    				case '4' : printf("Avion ajouter : Embraer Brasilia\n");break;
    				case '5' : printf("Avion ajouter : Jet Stream \n");break;
    			}
    			switch (recoit.num[1])
    			{
    				case '1' : printf("Compagnie : Air France \n");break;
    				case '2' : printf("Compagnie : Ryan Air \n");break;
    				case '3' : printf("Compagnie : American Airlines \n");break;
    				case '4' : printf("Compagnie : Air canada \n");break;
    				case '5' : printf("Compagnie : Japan air \n");break;
    				default : printf("Aucun ajout\n");
    			}
     
    			sleep(1);
     
    			for(i = 13; i >= 0; i--)
    			{
    				if(i > 2)
    			     		printf("\rTemps restant avant décollage : %d\n", i-3);
    				else
    				printf("\rTemps restant avant décollage : --");
    				printf("\rTemps restant avant prochain décollage : %d\n", i);
    				printf("Nombres d'avions en attente : %d\n\n", file_attente.msg_qnum);
    				sleep(1);
    				system("clear");
    			}
    		 }
    	}
    }

  4. #4
    Membre averti
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    417
    Détails du profil
    Informations personnelles :
    Âge : 37
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations forums :
    Inscription : Mai 2007
    Messages : 417
    Points : 376
    Points
    376
    Par défaut
    ouai mais sans le programme d'envoi c'est pas simple de tester

    sinon donne plus d'infos sur ton problème de segmentation fault (gdb ...)


    édit: j ai stubbé la gestion des messages queues et ça fonctionne bien

    genre ça:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    Temps restant avant décollage : 7
    Temps restant avant prochain décollage : 10
    Nombres d'avions en attente : -8192
    ...
    donc ça doit venir de ta gestion des MQ

    d'ailleurs cette ligne est un peu surprenante:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    receive = msgrcv(message, &recoit, sizeof(recoit), recoit.mtype, IPC_NOWAIT);
    Dans le champ msgtyp tu mets recoit.mtype qui n'est pas initialisé la première fois ?

  5. #5
    Nouveau Candidat au Club
    Inscrit en
    Décembre 2009
    Messages
    3
    Détails du profil
    Informations forums :
    Inscription : Décembre 2009
    Messages : 3
    Points : 1
    Points
    1
    Par défaut
    Ok bin je vais voir de plus près la gestion des MQ je remettrai un poste avec le code pour ajouter des avions se soir si tu veut je l'ai pas sur moi la.

    Merci de m'avoir apporté ton aide.

Discussions similaires

  1. Réponses: 0
    Dernier message: 10/11/2010, 15h10
  2. Problème d'utilisation des files
    Par AraBorLeg dans le forum C
    Réponses: 4
    Dernier message: 06/01/2007, 20h55
  3. IPC - Files de messages - Structure des messages
    Par Mattius007 dans le forum C
    Réponses: 2
    Dernier message: 03/01/2007, 10h51
  4. Réponses: 3
    Dernier message: 11/06/2003, 00h18

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