2017-11-15 1 views
1

Wenn ein Prozess geöffnet verwendet (2) (oder ähnlich) mehr als ein Deskriptor für dieselbe Datei zu erhalten, werden diese Deskriptoren unabhängig von Flock() behandelt. Ein Versuch, die Datei mit einem der folgenden Dateideskriptoren zu sperren, kann durch eine Sperre verweigert werden, die der aufrufende Prozess bereits über einen anderen Deskriptor platziert hat.Confusing Dokumentation des Flocks (2)

Wenn flock() behandelt die Deskriptoren unabhängig, weshalb die Datei Verriegeln einer der Datei-Deskriptoren unter Verwendung würde durch eine über einen anderen Deskriptor plaziert Sperre verweigert werden? Was bedeutet unabhängig hier bedeuten?

Auch wenn ich einen der Deskriptor entsperren, würden auch andere Deskriptoren entsperren?

Antwort

1

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.

1

Angenommen, Ihr Prozess zwei Dateideskriptoren hat, fd1 und fd2, die auf der gleichen Datei arbeiten.Wenn Sie ein Segment der Datei auf fd1 sperren und wenn ein anderes überlappendes Segment auch auf fd1 sperren, werden sich die zwei Sperren gegenseitig nicht stören, da sie sich in demselben Dateideskriptor befinden.

Wenn jedoch die zweite Sperre auf fd2 statt fd1 angewendet wurde, würden sich die Sperren überschneiden und die zweite Sperre würde als störend empfunden werden und würde fehlschlagen, obwohl es sich um den gleichen Vorgang handelt Verriegelung.

Dies ist der Sinn, in dem die Sperren für die Dateideskriptoren unabhängig voneinander sind - das Sperrsystem prüft nicht, welcher Prozess die störenden Sperren für einen anderen Dateideskriptor besitzt. Es reicht aus, dass es sich nicht um den aktuellen Dateideskriptor handelt.

Wenn Sie einen Deskriptor entsperren, ändern Sie die Sperren für keinen anderen Dateideskriptor.