![Linux 上 O_APPEND 模式下檔案的原子寫入與告訴](https://rvso.com/image/154444/Linux%20%E4%B8%8A%20O_APPEND%20%E6%A8%A1%E5%BC%8F%E4%B8%8B%E6%AA%94%E6%A1%88%E7%9A%84%E5%8E%9F%E5%AD%90%E5%AF%AB%E5%85%A5%E8%88%87%E5%91%8A%E8%A8%B4.png)
我正在處理一種情況,我想為具有許多進程和這些進程中的許多線程的應用程式持久保存狀態。通常這需要大量使用鎖定來確保不存在衝突。
我希望透過使用 O_APPEND 模式將資料儲存到文件中來避免這種情況。這樣只要我保證資料<4KiB寫入檔案就會是原子的。如果我使用僅附加資料結構,那麼我就有一個無鎖解決方案。
但是,為了使其正常工作,我需要在寫入該文件後知道該文件中資料的位置。我遇到的問題是,我無法找到寫入檔案的系統調用,然後告訴我寫入的檔案內的偏移量。
我可以使用寫入和查找來發現這個位置。但是,如果另一個線程共享相同的檔案描述符,那麼這是不安全的,因此需要我使用互斥鎖來保護寫入,這違背了我避免鎖定的努力。
檢查 write、writev、pwrite 和 prwritev 的手冊頁沒有顯示任何可以執行寫入操作,然後告訴我寫入後作為單一系統調用的偏移量的內容,我完全知道可能不會。我是不是看太多了?