檔案鎖定(File Locking)

 

檔案鎖定(File Locking)

File Locking 提供協同檔案存取一個非常簡單且極為有用地機制,在我開始設計這細節以前讓我暫時代替你進行某些檔案鎖定秘密。有兩種類型鎖定的機制:一種是強制性;一種 是詢問性。強制性系統實際上是將防止檔案的讀取和寫入。有許多的 Unix 系統都支援強制性鎖定。然而我就不再提到他們了。取而代之只討論有關於詢問性鎖定,以一個詢問性鎖定系統,當檔案被鎖定時,process 仍然可以讀取和寫入檔案。沒有意義嗎?不完全是!讀取或寫入以前,存在著一個讓 process 去檢查鎖的存在與否,這是一種協調鎖定系統。這是對所有需要 File Locking 的工作來說是簡單而足夠的。以後我再討論這個文件中的鎖,便是在說詢問性的鎖。

詢問性的鎖又分兩種類型,分別是:寫入鎖和讀取鎖(也分別 叫做分享鎖或獨有鎖)。讀取鎖的工作不會影響其他的讀取鎖。例如,若干 process 可以同樣讀取上鎖的檔案。然而,當一個 process 在檔案設置一個寫入鎖時,在直到它結束為止沒有其他的 process 可以開啟任何一個讀取鎖或者寫入鎖。 簡單來說,那就是同時可以有很多讀取者,但是這只能在同一時間給一個人寫入。因為在多人多工的作業環境下,數個處理程序對同個檔案進行同步的存取是十分平常的事情。為了確保檔案存取作業的同步與資料的安全,檔案鎖定是必要的功能。這怎麼講呢?是想這樣的情形:使用者甲與使用者乙不約而同的對同一個檔案進行修改,此時系統若無提供鎖定的功能,則兩個使用者中後執行檔案存入的那個人會將先進行檔案儲存者的資料給全數覆蓋掉。

在 Unix 系統鎖定檔案有很多方法。系統V像是 lockf() 個人的吸收。好一點的系統對鎖的控制flock() 提供更好支援,但是仍然很缺乏實際的方法,為了輕便性跟安全性,我將談到關於如何使用 fcntl() 來鎖定檔案。我建議你去使用其中一種高階的 flock() 類型的函式,如果他符合你的需求。


設置鎖定

我們只使用它於 file locking。 藉由填寫 struct flock (在 fcntl.h 中宣告)組成設定鎖來描述鎖所需要的類型,open()ing 有相配方式的檔案,並且用適當的參數來呼叫 fcntl():

    struct flock fl;
int fd;
fl.l_type = F_WRLCK; /* F_RDLCK,F_WRLCK,F_UNLCK */
fl.l_whence = SEEK_SET; /* SEEK_SET,SEEK_CUR,SEEK_END */
fl.l_start = 0; /* Offset from l_whence */
fl.l_len = 0; /* length,0 = to EOF */
fl.l_pid = getpid(); /* our PID */
fd = open("filename",O_WRONLY);
fcntl(fd,F_SETLKW,&fl); /* F_GETLK,F_SETLK,F_SETLKW */
讓我們以 struct flock 開始,因為用它的領域來描述鎖的行為發生。以下是領域定義:

l_type
這是你表明你想要設置鎖類型的地方。它可能是 F_RDLCK, F_WRLCK, or F_UNLCK如果你想要分別的設置讀取鎖,寫入鎖&#
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值