|
Publicité ' | |||||||||||||||||||||||
|
|
#1 | ||||
|
Invité régulier
![]() Inscription : août 2010 Messages : 19 ![]() |
Bonjour à tous,
Pour un exercice, je dois transférer une chaine de caractères d'un client vers un serveur, ce dernier transforme les minuscules en majuscule et la renvoie au client, tout ça en utilisant des sémaphores et une mémoire partagée. A mon avis, ce qui coince, c'est que je n'utilise pas les sémaphores au bon moment. Les fonctions down, up et initialize sont correctes car je les ai déjà utilisées dans un exercice précédent. Si vous pouviez jeter un coup d'oeil, ce serait sympa. Client : Code :
Code :
|
||||
|
|
00
|
|
|
#2 |
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 316 ![]() |
Soucies toi en premier lieu du retour de tes fonctions, cela renvoie peut être -1 et dans ce cas regardes l'erreur dans errno.
__________________
|
|
|
00
|
|
|
#3 | ||
|
Invité régulier
![]() Inscription : août 2010 Messages : 19 ![]() |
Tu veux parler pour shmat ? Le reste ne renvoie pas d'erreur.
Pour le client, Code :
|
||
|
|
00
|
|
|
#4 |
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 316 ![]() |
Je parlais du retour de tes fonctions down et up et donc de semop().
Aussi tu as un souci avec l'utilisation de scanf, c'est l'adresse que tu dois lui passer => &string
__________________
|
|
|
00
|
|
|
#5 | ||||
|
Invité régulier
![]() Inscription : août 2010 Messages : 19 ![]() |
J'avance j'avance
Mes sémaphores sont ok, les processus affichent bien leur message à tour de rôle au bon moment. Par contre, le serveur ne reçoit pas la modification du client et vice versa. Voilà le code travaillé (uniquement la partie modifiée) : Client : Code :
Code :
Le serveur quand à lui, affichera "serveur " Et quand ça sera de nouveau au tour du client, il réaffichera "test" La mémoire n'est pas partagée en fait. Est-ce que je dois attacher la mémoire de mon serveur après le down(semid, 0) ? Merci de ton aide |
||||
|
|
00
|
|
|
#6 | |
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 316 ![]() |
Regardes le contenu de la variable errno après le shmat pour vérifier qu'il a bien réussi à attacher la mémoire.
Citation:
__________________
|
|
|
|
00
|
|
|
#7 | ||
|
Invité régulier
![]() Inscription : août 2010 Messages : 19 ![]() |
Tiens, je ne connaissais pas errno.
Je ne sais pas si je l'ai bien fait : Code :
|
||
|
|
00
|
|
|
#8 |
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 316 ![]() |
string est un char* donc ta condition ne sera jamais valide.
Le plus simple reste encore d'afficher errno avant l'appel de la fonction et après. C'est juste pour le debug et t'as pas à te soucier de comment caster le retour ou comment le comparer.
__________________
|
|
|
00
|
|
|
#9 | ||
|
Invité régulier
![]() Inscription : août 2010 Messages : 19 ![]() |
En effet, tu a raison, j'ai errno=22 dans le code serveur !
Cependant, errno passe de 0 à 22 dans la fonction initialize(), plus précisément : Code :
Mais je ne vois pas en quoi ça affecte ma mémoire partagée. Surtout que mes sémaphores fonctionnent bien. En remettant errno=0 avant le shmat, il ne change pas de valeur après. |
||
|
|
00
|
|
|
#10 |
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 316 ![]() |
Cette erreur indique que le système n'a pas assez de semaphore.
Tu travailles en local ou bien sur un serveur utilisé par d'autres ? Je dis ça car j'ai eu des TPs durant mes études où il était bien difficile de faire tourner un quelconque programme en raison des étudiants ne libérant pas correctement la mémoire... Donc seuls les étudiants du lundi (après reboot du weekend) pouvaient exécuter les TPs correctement.
__________________
|
|
|
00
|
|
|
#11 |
|
Invité régulier
![]() Inscription : août 2010 Messages : 19 ![]() |
Non c'est en local. Que ce soit à la salle de TP ou chez moi.
|
|
|
00
|
|
|
#12 |
|
Expert Confirmé
![]() Baptiste ROUSSELDéveloppeur Temps réel Embarqué Inscription : janvier 2011 Messages : 1 316 ![]() |
Tu as une commande normalement permettant de visualiser les objets partagés.
J'ai pas retrouvé ça, mais si tu as un cours cela devrait être abordé. Regardes donc grâce à cette commande si tu n'as pas une foule d'objets utilisés, ou peut être créés et abandonnés. Car après pour augmenter le nombre de sémaphore disponible il faut soit en libérer, soit recompiler le noyau en augmentant le nombre si je ne m'abuse. Toujours est-il qu'il est bizarre que tu obtiennes cet errno sur semctl, cette fonction n'a pas vocation à créer une sémaphore. :/
__________________
|
|
|
00
|
|
|
#13 | ||||
|
Invité régulier
![]() Inscription : août 2010 Messages : 19 ![]() |
Voilà c'est réglé, il y avait juste un problème de IPC_CREAT dans le client et des & en trop dans les scanf et prinf car ce sont des pointeurs.
Voilà le code final : Client Code :
Code :
|
||||
|
|
10
|
Copyright © 2000-2013 - www.developpez.com