poser un verrou sur un fichier [Resolu] [C Linux] - C - Programmation
Marsh Posté le 24-10-2006 à 21:36:40
J'ai du mal à croire que personne n'aie jamais posé de verrou Posix ici.
Marsh Posté le 25-10-2006 à 15:06:12
escaflownn a écrit : Bonjour les cracks.
|
Désolé, j'ai pas le temps d'examiner ton code en détail. Je remarque quand-même que les fonctions "lock_socket" et "unlock_socket" sont quasiment les mêmes et pourraient être regroupées en une seule qui recevrait un paramètre supplémentaire "lock/unlock". Mais le pb ne vient pas de là.
Télécharge mon cours sur les processus http://fr.lang.free.fr/cours/Processus_Csyst_v1.0.pdf. Il y a un chapitre qui parle de la pose des verrous. Si j'ai un peu de temps, je reviendrai plus tard voir ce qui peut clocher...
Petit conseil: tu devrais utiliser de temps en temps "errno" ainsi que "perror()" histoire d'afficher ce que te dit le système quand ça cloche.
Autre remarque: Tes fonctions "lock/unlock" utilisent une structure statique ce qui signifie que la variable "lock" garde ses valeurs entre chaque appel. Si jamais un des membres de "lock" n'est pas réinitialisé alors qu'il le devrait, il gardera la valeur précédente et si celle-ci n'est pas bonne...
En général, une variable locale ne se met "static" que si on a un besoin impératif de garder sa valeur entre chaque appel (cas d'un compteur d'appels par exemple)...
Marsh Posté le 25-10-2006 à 15:46:24
Merci pour tes précieux conseils, j'ai refondu le code en conséquence.
Concernant le problème, l'erreur venait du mode opératoire en deux points:
*tout d'abord vim ne tient pas compte des verrous, pour vérifier que le verrou est posé, il suffit en réalité d'éxécuter deux fois le processus en même temps.
*la fonction is_locked_socket() ne permet pas de vérifier à postériori si le processus a lui même posé un verrou, car un processus peut toujours poser un verrou à la place d'un verrou qu'il a lui même posé antèrieurement. C'est pour cette raison qu'elle renvoyait 0.
main.c
Code :
|
lock.c
Code :
|
Marsh Posté le 25-10-2006 à 21:18:00
escaflownn a écrit : Merci pour tes précieux conseils. |
J'ai pas dit grand chose de réellement utile. Mais si ça marche, tant mieux.
Marsh Posté le 23-10-2006 à 19:07:51
Bonjour les cracks.
J'ai crée un programme pour me familiariser avec les verrous.
Mon mode opératoire est le suivant, je crée et verrouille un fichier "socket.tmp" dans le repertoire /tmp, puis je mets le programme en pause (getchar).
J'ouvre ce fichier avec l'éditeur vim et je tente d'écrire dessus pour vérifier que le verrou soit bien installé. Or je peux écrire sans problème sur le fichier alors qu'il devrait être vérrouillé.
Si j'ouvre le fichier en lecture seulement, le fcntl() ne veut pas le verrouiller en écriture, ce qui me laisse supposer que fcntl() tente bien la pose de verrou.
La fonction is_locked_socket() censée vérifier que le verrou est présent rapporte dans tous les cas que le fichier n'est pas verrouillé !
=> J'en conclu que fcntl() démarre la pose du verrou mais cette dernière n'aboutie pas. fcntl() ne renvoit pourtant aucun message d'erreur.
main.c
socket.c
Message édité par escaflownn le 25-10-2006 à 15:46:37