歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Linux fcntl函數 建議鎖 強制鎖

Linux fcntl函數 建議鎖 強制鎖

日期:2017/2/28 13:46:33   编辑:Linux教程

在多個進程訪問同一個文件的時候,我們肯定不希望在一個進程寫入或修改文件時,另外一個進程也可以修改文件內容,這樣就亂了,Linux在底層通過加鎖的方式來避免這種文件,我們可以通過fcntl函數來給文件上鎖,鎖又分為建議鎖和強制鎖,建議鎖,顧名思義,相對溫柔一些,在對文件進行鎖操作時,會檢測是否已經有鎖存在,並且尊重已有的鎖,但是另外的進程還可以修改文件。在一般的情況下,內核和系統都不使用建議鎖。強制性的鎖是由內核執行的鎖,當一個文件被上鎖進行寫入操作的時候,內核將阻止其他進程對其進行讀寫操作。采取強制性的鎖對性能的影響很大,每次進行讀寫操作都必須檢查是否有鎖存在,fuctl默認是建議鎖,如果想用強制鎖,需要重新掛載mount系統分區,我們先看看fcntl函數
函數原型
int fcntl(int fd,int cmd,struct flock *lock);
fd為文件描述符

cmd是一些命令參數

F_GETLK 根據lock參數值,決定是否上文件鎖

F_SETLK 設置lock參數值的文件鎖

F_SETLKW 這是 F_GETLK的阻塞版本,在無法獲取鎖時,會進入睡眠狀態

flock是一個結構體
flock結構體的定義如下:

struct flock {
short l_type;
off_t l_start;
short l_whence;
off_t l_len;
pid_t l_pid;
}

l_type有三個選項:
F_RDLCK : 共享鎖,只讀用
F_WRLCK : 獨占鎖(寫操作鎖)
F_UNLCK : 解除鎖定
l_start 為相對位移量
l_whence 必須是以下幾個值之一( 在 unistd.h 中定義):
SEEK_SET : 文件開始位置
SEEK_CUR: 文件當前位置
SEEK_END: 文件末尾位置

l_len 加鎖的長度 0 為到文件末尾
l_pid當前文件操作的進程id號

好了,下面來看一個例子:

我們用一個死循環來防止這個進程死掉

這樣這個進程就一直在執行,我們新開一個遠程端,來修改hello.txt這個文件

我們發現還是可以修改這個文件,這是因為fcntl函數默認是建議鎖,如果想用強制鎖呢,需要重新mount分區

我們再來跑一下程序

再在另外一個遠程終端修改hello.txt

我們發現他阻塞在這裡了,也就是暫時不能修改了,這個時候我強制終止前一個進程

再來看另外一個遠程終端

發現已經修改了。

好了,Linux fcntl函數的建議鎖和強制鎖就總結到這裡,如有問題,歡迎指正,謝謝。

Copyright © Linux教程網 All Rights Reserved