programmation IPC (memoire partagee) sous Unix >> magie inside << [C] - C - Programmation
Marsh Posté le 25-02-2004 à 13:43:46
...bien et maintenant voici le code (dont j'ai vire quelques les commentaires pour faire court et les test d'erreurs)
shm_create.c :
Code :
|
le programme de shm_prod2.c :
Code :
|
la structure QueueLimited :
Code :
|
voila tout
Marsh Posté le 25-02-2004 à 14:01:47
Bon voilà, j'espere que kk1 d'entre vous pourra m'eclairer.
Desole mais je ne peux pas faire plus court je pense
@+ je dois y aller
Marsh Posté le 26-02-2004 à 13:27:06
j'ai cherché jusqu'à 2 heures du mat , personne n'a une petite idée ?
Marsh Posté le 27-02-2004 à 15:17:04
Alors là j'hallucine grave !
Avec ce code ci-dessus, le programme producteur n'arrive pas a ecrire dans la shm (ca se voit lorsque il liste le contenu de celle-ci).
En rajoutant simplement l'instruction suivante :
Code :
|
après le 1er appel ftok() dans shm_prod2.c, le programme producteur se met à marcher ! :
il ecrit bien dans la shm et lorsque il lit le contenu, on voit bien la valeur ainsi déposée.
Ceci est un tour de magie dont je ne peux expliquer.
Avant de rire derriere votre écran, j'aimerais bien que vous compiliez ce code.
Regardez la sortie obtenue AVANT puis APRES l'ajout de l'instruction printf; et vous verrez que je ne raconte pas de sottises !
De mon coté, j'ai fais ça sur 2 machines differentes, et le resultat est bien comme je l'ai dis. (une sous Redhat, l'autre sous Mandrake).
Bref j'attends des explications sur la "magie" de l'informatique
Autre chose, ayant donc "reussi" (je ne comprends pas quel miracle) a faire fonctionner au moins un producteur et un consommateur ensemble, les 2 programmes bouclant en permanence, au bout d'un certain temps aléatoire (assez court), un programme plante sur l'instruction semop() (fonction ininterruptible) a cause de la reception d'un signal système (EINTR).
Comment cela se fait, je n'ai aucune explication la dessus
Marsh Posté le 27-02-2004 à 15:27:27
Il manque pleins de ; en fin de ligne. Comment veux tu que ça compile ton code ?
Marsh Posté le 02-03-2004 à 10:15:33
Kristoph a écrit : Il manque pleins de ; en fin de ligne. Comment veux tu que ça compile ton code ? |
a la place des tests d'erreur , j'ai transformer la ligne en instruction, fo juste les rajouter j'ai oublier
Marsh Posté le 02-03-2004 à 10:32:21
Giz a écrit : |
Je ne t'avais pas attendu pour corriger ça mais ça fait perdre du temps quand on copie colle le code pour le tester et donc comme ça tu as potentiellement perdu de l'aide.
De plus, le programme a planté une fois au bout de quelque temps, et après il ne voulait plus se lancer du tout Même Valgrind plantait.
Marsh Posté le 02-03-2004 à 12:06:05
sous nunux, les sémaphores (et mémoire partagée ché pu ) survivent à la mort du process.
Marsh Posté le 02-03-2004 à 19:03:09
Kristoph a écrit : |
au lieu de me faire un caca nerveu, tu veux que je te mail ENTIEREMENT les sources (2 prod + 2 conso + creation + destruction + analyse des semaphores + analyse de la shm + tout les makefile)
Et la tu compile et tout marchera nickel (il me faut ton mail)
Marsh Posté le 25-02-2004 à 13:30:47
voila, ayant deja poste un topic auparavant sur ce probleme (dont j'ai trouve la reponse), j'ai de nouveau un probleme sur ce sujet.
Pour etre clair, precis et concis, mon programme IPC utilise une zone de memoire partagee :
- j'ai un programme qui cree la shm
- j'ai un programme qui depose dans la shm
- ... rien qu'avec ces 2 programme, kkchose ne tourne pas rond.
Je les lance l'un apres l'autre :
d'abord la creation...une fois le programme termine, je lance le programme producteur.
Le probleme c'est que ce dernier n'arrive pas a ecrire dans la shm (malgre qu'il a les droits)
J'espere que la sortie suivante, bien que lourde, vous aiderez a voir clairement que le producteur n'ecrit rien dans la shm (on le voit quand j'affiche le contenu de la shm) mais sait y lire dedans;
alors que le programme de creation lui arrive bien a y lire/ecrire dedans.
voici la sortie du programme de creation :
/Net/mahonet/Utilisateurs/ffournel/iup/shm_queue_v2>./shm_create
creation : creation de la zone de memoire partagee...
creation : creation de l'ensemble des semaphores...
creation : je suis attache au segment shm d'adresse 0x40016000...
creation : contenu de la shm : 0, adresse 0x40016000
creation : contenu de la shm : 0, adresse 0x40016004
creation : contenu de la shm : 0, adresse 0x40016008
creation : contenu de la shm : 0, adresse 0x4001600c
creation : contenu de la shm : 0, adresse 0x40016010
creation : contenu de la shm : 0, adresse 0x40016014
creation : contenu de la shm : 0, adresse 0x40016018
creation : contenu de la shm : 0, adresse 0x4001601c
creation : contenu de la shm : 0, adresse 0x40016020
creation : contenu de la shm : 0, adresse 0x40016024
creation : contenu de la shm : 0, adresse 0x40016028
creation : contenu de la shm : 0, adresse 0x4001602c
creation : contenu de la shm : 0, adresse 0x40016030
creation : contenu de la shm : 0, adresse 0x40016034
creation : contenu de la shm : 0, adresse 0x40016038
creation : initialisation de la structure QueueLimited dans la shm...
creation : fifo->elements = 0x40016014
creation : fifo->head = 0x40016014
creation : fifo->end = 0x40016014
creation : fifo->max = 0x4001603c
creation : fifo->size_elt = 4
creation : contenu de la shm : 0x40016014, adresse 0x40016000
creation : contenu de la shm : 0x40016014, adresse 0x40016004
creation : contenu de la shm : 0x40016014, adresse 0x40016008
creation : contenu de la shm : 0x4001603c, adresse 0x4001600c
creation : contenu de la shm : 0x4, adresse 0x40016010
creation : contenu de la shm : 0, adresse 0x40016014
creation : contenu de la shm : 0, adresse 0x40016018
creation : contenu de la shm : 0, adresse 0x4001601c
creation : contenu de la shm : 0, adresse 0x40016020
creation : contenu de la shm : 0, adresse 0x40016024
creation : contenu de la shm : 0, adresse 0x40016028
creation : contenu de la shm : 0, adresse 0x4001602c
creation : contenu de la shm : 0, adresse 0x40016030
creation : contenu de la shm : 0, adresse 0x40016034
creation : contenu de la shm : 0, adresse 0x40016038
creation : je me suis detache du segment shm 0x40016000...
voici la sortie du programme de production :
/Net/mahonet/Utilisateurs/ffournel/iup/shm_queue_v2>./shm_prod2
producteur 2 : je suis attache au segment shm d'adresse 0x40015000...
producteur 2 : fifo->elements = 0x40016014
producteur 2 : fifo->head = 0x40016014
producteur 2 : fifo->end = 0x40016014
producteur 2 : fifo->max = 0x4001603c
producteur 2 : fifo->size_elt = 4
producteur 2 : contenu de la shm : 0x40016014
producteur 2 : contenu de la shm : 0x40016014
producteur 2 : contenu de la shm : 0x40016014
producteur 2 : contenu de la shm : 0x4001603c
producteur 2 : contenu de la shm : 0x4
producteur 2 : contenu de la shm : 0
producteur 2 : contenu de la shm : 0
producteur 2 : contenu de la shm : 0
producteur 2 : contenu de la shm : 0
producteur 2 : contenu de la shm : 0
producteur 2 : contenu de la shm : 0
producteur 2 : contenu de la shm : 0
producteur 2 : contenu de la shm : 0
producteur 2 : contenu de la shm : 0
producteur 2 : contenu de la shm : 0
producteur 2 : je suis en zone critique : depot de 18 a l'adresse : 0x40016014
producteur 2 : contenu de la shm : 0x40016014, adresse : 0x40015000
producteur 2 : contenu de la shm : 0x40016014, adresse : 0x40015004
producteur 2 : contenu de la shm : 0x40016014, adresse : 0x40015008
producteur 2 : contenu de la shm : 0x4001603c, adresse : 0x4001500c
producteur 2 : contenu de la shm : 0x4, adresse : 0x40015010
producteur 2 : contenu de la shm : 0, adresse : 0x40015014
producteur 2 : contenu de la shm : 0, adresse : 0x40015018
producteur 2 : contenu de la shm : 0, adresse : 0x4001501c
producteur 2 : contenu de la shm : 0, adresse : 0x40015020
producteur 2 : contenu de la shm : 0, adresse : 0x40015024
producteur 2 : contenu de la shm : 0, adresse : 0x40015028
producteur 2 : contenu de la shm : 0, adresse : 0x4001502c
producteur 2 : contenu de la shm : 0, adresse : 0x40015030
producteur 2 : contenu de la shm : 0, adresse : 0x40015034
producteur 2 : contenu de la shm : 0, adresse : 0x40015038
producteur 2 : je suis en zone critique : depot de 65 a l'adresse : 0x40016018
producteur 2 : contenu de la shm : 0x40016014, adresse : 0x40015000
producteur 2 : contenu de la shm : 0x40016014, adresse : 0x40015004
producteur 2 : contenu de la shm : 0x40016018, adresse : 0x40015008
producteur 2 : contenu de la shm : 0x4001603c, adresse : 0x4001500c
producteur 2 : contenu de la shm : 0x4, adresse : 0x40015010
producteur 2 : contenu de la shm : 0, adresse : 0x40015014
producteur 2 : contenu de la shm : 0, adresse : 0x40015018
producteur 2 : contenu de la shm : 0, adresse : 0x4001501c
producteur 2 : contenu de la shm : 0, adresse : 0x40015020
producteur 2 : contenu de la shm : 0, adresse : 0x40015024
producteur 2 : contenu de la shm : 0, adresse : 0x40015028
producteur 2 : contenu de la shm : 0, adresse : 0x4001502c
producteur 2 : contenu de la shm : 0, adresse : 0x40015030
producteur 2 : contenu de la shm : 0, adresse : 0x40015034
producteur 2 : contenu de la shm : 0, adresse : 0x40015038
on voit que le depot de la valeur 18 et 65 en shm ont echoue car le contenu est inchange
Message édité par Giz le 27-02-2004 à 15:17:48