behandelt unabhängig durch flock()
bedeutet, dass nicht flock()
„ask“ einen Deskriptor, wenn die andere zu ändern versucht. Es bedeutet jedoch nicht, dass sie wirklich unabhängig sind. Wenn flock()
versucht, einen zu sperren, während der andere bereits gesperrt ist, kann dieser Versuch blockieren.
Betrachten Sie es als 2-Ebenen-Mechanismus. flock()
sieht immer nur einen Deskriptor gleichzeitig an, aber nach dem Lock-Versuch versucht das System schließlich, auf den Löffelstiel zu wechseln und tatsächlich zu sperren, und das Problem tritt auf.
Auch wenn ich einen der Deskriptor entsperren, würden andere Deskriptoren entsperren?
Ich bin mir nicht sicher. Dieses Zitat (unten) besagt, dass dies in der Tat der Fall ist, wenn eine Datei mehrere Deskriptoren von fork(2), dup(2)
hat. Allerdings gibt es nichts, was im 2. Absatz sagt so, dass mehrere open(2)
behandelt, die mich führt zu glauben, dass es einfach keine gute Sache zu tun :)
Von here:
Locks durch Herde erstellt () sind einer offenen Dateibeschreibung zugeordnet (siehe open (2)). Dies bedeutet, dass doppelte Dateideskriptoren (erstellt zB von zB fork (2) oder dup (2)) auf dasselbe Schloss verweisen, und dieses Schloss kann unter Verwendung von dieser Dateideskriptoren geändert oder freigegeben werden . Darüber hinaus wird die Sperre entweder durch eine explizite Operation LOCK_UN auf einem dieser doppelten Dateideskriptoren oder wenn alle diese Dateideskriptoren geschlossen wurden freigegeben.
Wenn ein Prozess open (2) (oder ähnlich) verwendet, um mehr als eine Datei Deskriptor für die gleiche Datei zu erhalten, werden diese Dateideskriptoren unabhängig von flock() behandelt. Ein Versuch, die Datei unter Verwendung eines der folgenden Dateideskriptoren zu sperren, kann durch eine Sperre verweigert werden, die der aufrufende Prozess bereits über einen anderen Dateideskriptor platziert hat.