|
Publicité ' | |||||||||||||||||||||||
|
|
#1 |
|
Invité régulier
![]() Étudiant Inscription : novembre 2011 Messages : 32 ![]() |
Bonjour!
Dans un TD de cours on est censé créer une bibliothèque permettant la création rapide de mutex/sémaphores. On a eu la correction et pourtant sur mon ordinateur ça ne marche pas je ne sais pas pourquoi. J'ai montré mes algorithmes à mon professeur il ne comprend pas non plus pourquoi, or j'ai besoin de cette bibliothèque pour un projet... Pouvez vous m'aider ? :/ Je met mes algorithmes en pièces jointes : Maintenant je vous explique mon problème : on lance un processus fils, bloqué par un(e) mutex (P(mutex)). Le processus père attend cinq secondes puis incrémente la mutex (V(mutex)). Donc normalement quand on lance le programme, il ne se passe rien pendant 5 secondes puis le processus fils débloqué affiche "mutex passé" puis le programme se coupe. Alors que chez moi, il se passe le contraire, le programme affiche directement "mutex passé" puis se ferme après avoir attendu 5 secondes. Quelqu'un sait il pourquoi ? MOn professeur, avec mes algorithmes arrive à le faire marcher... J'ai le même problème pour mon projet. Voilà merci beaucoup si vous vous penchez sur la question! Misaki |
|
|
00
|
|
|
#2 | |||
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
Bonjour,
Il y a plusieurs erreurs dans ton code. — Sur la forme : il manque les headers #include <sys/ipc.h>, #include <sys/sem.h> et #include <unistd.h> (pour sleep() et fork()) dans ton programme ; — Sur le fond : tes appels à P et à V peuvent échouer mais tu ne le contrôles pas. Tu aurais dû. Si tu écris : … tu obtiens : Reste à savoir pourquoi tu n'as pas les autorisations d'écriture dans le sémaphore. Le problème vient de cette ligne-là : La priorité des opérateurs en C nous indique que l'opérateur de comparaison « == » est plus fort que celui d'affectation « = ». Ça signifie que ton programme va d'abord vérifier si la valeur renvoyée par ftok() est égale à « -1 », puis stocker le résultat de cette comparaison dans « cle », donc zéro si c'est faux. Tu vas donc avoir une variable « cle » toujours nulle dans des conditions d'exécution normales. Or, il se trouve que « 0 » correspond à la valeur de la clé spéciale « IPC_PRIVATE ». Ton appel aux sémaphores va donc réussir quand même et tu vas obtenir un identifiant valide. En principe, tu devrais aussi hériter des droits. Donc, il doit y avoir encore quelque chose de plus qui fasse planter l'affaire, mais peu importe : c'est suffisamment irrégulier pour provoquer des bugs et nécessiter d'être corrigé. D'autre part, la man page précise que passer « 0 » en second argument de ftok() donne des résultats indéfinis : Si tu utilises GCC et que tu veux programmer avec des options de compilation strictes, insère ceci dans ton fichier ~/.bashrc Ceci te donnera la plupart des messages d'erreur et d'avertissement utiles, et considèrera les warnings comme des erreurs, ce qui t'obligera à les corriger d'emblée. Au quotidien, ces options sont suffisamment strictes pour écrire des programmes à peu près propres mais, en entreprise et lorsque l'on travaille collaborativement, il arrive que l'on ajoute en plus un certain nombre d'options, jusqu'à une trentaine, qui ne sont pas prises en charge par -Wall ni -Wextra. |
|||
|
|
00
|
|
|
#3 | |||
![]() ![]() R&D en systemes informatiques bas niveau Unix/Linux Inscription : mai 2004 Messages : 7 191 ![]() |
Citation:
Code :
|
|||
|
|
00
|
|
|
#4 | |
![]() ![]() Chercheur d'emploi Inscription : septembre 2007 Messages : 4 614 ![]() |
Citation:
En l'occurrence, l'auto-affectation ne sert peut-être pas à grand chose dans le cas d'un if, mais elle devient très intéressante dans le cas d'un while, où cela nous évite d'avoir à rajouter une instruction supplémentaire en dehors du corps de la boucle uniquement pour l'initialiser. |
|
|
|
00
|
|
|
#5 | |
![]() ![]() R&D en systemes informatiques bas niveau Unix/Linux Inscription : mai 2004 Messages : 7 191 ![]() |
Citation:
D'ailleurs, l'utilisation de l'operateur ternaire dans ton printf ne me choque pas. |
|
|
|
00
|
Copyright © 2000-2013 - www.developpez.com