2017-08-28 5 views
0

Comme dans GNU C Library documentation fcntl(F_OFD_SETLK) verrouille sur une entrée de table de fichier ouverte (généralement obtenue par open()). Facile à comprendre.Ouvrir le fichier Description Verrouille la confusion (EDIT)

Mais dans le même next example dans la documentation:

Dans le processus d'exemple, chaque thread appelle open(), de sorte que chaque descripteur de fichier doit pointer vers une entrée de table de fichier ouvert différent. Si le verrou acquis à partir de fcntl (fd, F_OFD_SETLKW, & lck) dans chaque thread est associé à une nouvelle entrée de table de fichiers ouverte, chaque thread obtient un verrou sur cette nouvelle entrée de table de fichier ouverte renvoyée par open() dans chaque fil.

Alors, comment les verrous sur les différentes entrées de la table de fichiers peuvent-ils fournir un accès en écriture exclusif?

Qu'est-ce qui me manque?

+0

Je ne comprends pas la question. Pourquoi croyez-vous que '' avoir juste un verrou sur une entrée de table de fichier ouverte différente ... signifie que ce verrouillage est complètement faux ''? – Scott

+1

L'exemple montre comment chaque thread verrouille le fichier pour obtenir un accès en écriture exclusif, provoquant le blocage des autres threads jusqu'à la libération du verrou. Maintenant, quel est ta question? – Philippos

+0

Si le verrou acquis à partir de fcntl (fd, F_OFD_SETLKW, & lck) dans chaque thread est associé à une nouvelle entrée de table de fichiers ouverts, chaque thread obtient un verrou sur cette nouvelle entrée de table ouverte retournée par open() dans chaque thread. Alors, comment les verrous sur les différentes entrées de la table de fichiers peuvent-ils fournir un accès en écriture exclusif? –

Répondre

0

Les verrous de fichiers POSIX d'origine verrouillent par processus. Par conséquent, si deux threads ont ouvert le même fichier, ayant pour résultat différents descripteurs de fichier, ils ont tous les deux pu obtenir des verrous exclusifs en même temps (car le processus était considéré comme le propriétaire du verrou). Ces sémantiques (combinées avec le comportement close) sont relativement inutiles, mais n'ont pas pu être modifiées pour des raisons de compatibilité descendante.

D'où la nécessité des opérations de verrouillage OFD fcntl séparées, qui se comportent comme si les fichiers étaient alors ouverts dans des processus séparés utilisant des verrous POSIX traditionnels. Dans les deux cas, le noyau doit déterminer l'objet/inode de fichier sous-jacent et le verrouiller; le verrouillage sur un descripteur de fichier ou une description de fichier est insuffisant. Autrement dit, la différence entre les verrous POSIX et OFD est que les verrous POSIX peuvent se greffer sur un verrou qui a déjà été acquis par le processus (un peu similaire aux mutex récursifs, mais pas tout à fait), alors que pour les verrous OFD le propriétaire du verrou. Mais les verrous réels sont toujours effectués sur le fichier.