2017-08-28 77 views
0

GNU C Library documentation fcntl(F_OFD_SETLK)鎖定打開文件表項(通常由open()獲取)。容易明白。打開文件說明Locks confusion(編輯)

但在同一文檔中的next example

在示例過程中,每個線程調用open(),所以每個文件描述符應指向一個不同的打開文件表項。

如果從每個線程中的fcntl(fd,F_OFD_SETLKW,& lck)獲取的鎖與新的打開文件表項關聯,則每個線程都會獲得由open()返回的新的打開文件表項的鎖定。在每個線程中。

話,怎麼可能在不同的文件表項的鎖提供獨佔寫訪問?

我缺少什麼?

+0

我不明白這個問題。爲什麼你認爲''只是鎖定不同的開放文件表條目......意味着這個鎖定是完全錯誤的''? – Scott

+1

該示例顯示了每個線程如何鎖定文件以獲得獨佔寫入訪問權限,導致其他線程停止運行,直到鎖定釋放。現在你的問題是什麼? – Philippos

+0

如果每個線程使用fcntl(fd,F_OFD_SETLKW,和LCK)獲取的鎖與一個新打開的文件表項相關聯,則每個線程獲得這個新的文件打開表通過開放()返回在每個線程進入一個鎖。那麼如何才能鎖定不同的文件表條目提供獨佔寫訪問? –

回答

0

原始POSIX文件鎖在那裏每個進程的鎖。其結果是,如果兩個線程打開同一個文件,從而導致不同文件描述符,他們都可以在同一時間獲得獨佔鎖(因爲這個過程被認爲是鎖的所有者)。這些語義(結合close行爲)相當無用,但出於向後兼容性的原因無法更改。

因此需要單獨OFD鎖定fcntl操作,這表現爲,如果隨後文件被使用傳統的POSIX鎖單獨的進程中打開。在這兩種情況下,內核都必須確定底層文件對象/ inode並將其鎖定;鎖定文件描述符或文件描述是不夠的。換句話說,對POSIX和OFD鎖之間的區別是,POSIX鎖可以在其已被處理(有點類似於遞歸互斥體,但並不完全),而對於OFD鎖,調用線程獲得鎖捎帶鎖主人。但實際的鎖總是在文件上執行。