2015-09-26 19 views
2
實現跨平臺的文件鎖定

我需要實現在GO以下行爲:如何GO

  1. 的處理應該能夠讀取文件而不管是否有其他進程已鎖定該文件編寫
  2. 在寫入文件之前,進程應獲得寫入鎖定。這是爲了保證多個進程不能寫同一個文件
  3. 的處理不應該等待獲取寫鎖,如果不能獲得一個鎖,應該在

對於基於UNIX的系統,系統調用包移到在GO中定義了flock功能,可以用以下方式實現上述行爲:

  1. 使用syscall.flock函數和LOCK_EX | LOCK_NB嘗試寫入文件
  2. 從GO文件

系統調用封裝的Windows閱讀之前不檢查任何鎖之前獲取的鎖,不包括羊羣。鑑於此,如何才能最好地編寫可執行跨平臺並具有上述行爲的代碼?

我想盡量做到這一點,而不會使操作系統特定的呼叫或使用不安全。

PS:我不想強制性的文件鎖定,該過程將檢查文件鎖執行文件操作

+0

我不是要求強制文件鎖定 – Ngm

+0

好的,你只需要LockFile [Ex]在windows上。我認爲你將不得不掛鉤到那個win cgo中(也許有一種方法可以通過系統調用從系統dll中獲得它;對不起,不是windows的傢伙) – JimB

+0

@JimB,但是有另一種方式,而不必調用系統特定的來電和使用不安全? – Ngm

回答

0

使用編譯器標誌前。

標誌的窗口:

// +build windows,!linux 
... 

標誌對於Linux:

// +build linux,!windows 
... 

如果你想使用平臺的本地鎖定功能。

解決方法可能是分配資源,這些資源是跨平臺的(應該是)單例,比如綁定到一個端口,並依賴於這種可能只有一次。綁定操作的錯誤條件將成爲決定性因素。

就我個人而言,我會選擇使用平臺原生選項,只是做一個接口,以便人們可以輕鬆地添加測試,從而確保事情不會中斷。