linux中断函数中有锁,Linux下fcntl实现建议锁和强制锁
近日小溫下APUE,發現Linux下的 fcntl 實現強制鎖的功能好像都沒試驗過,簡單做個測試。
首先用 fcntl 實現建議鎖(Advisory locking),比較簡單,貼個最簡單的代碼:
#include
#include
#include
#include
#include
#include
int main(int argc, char ** argv)
{
int fd = 0, ret = 0;
struct flock lock = {0};
lock.l_type = F_WRLCK;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
fd = open("test.file", O_RDWR | O_CREAT);
printf("before flock\n");
ret = fcntl(fd, F_SETLKW, &lock);
printf("after flock, ret: %d\n", ret);
getchar();
close(fd);
return 0;
}
關鍵的幾句已高亮顯示,用 F_SETLKW 等待寫的鎖,很好測試,分別開一個終端運行一次就可以測試出來。
Linux 同時實現了 POSIX 的 fcntl 鎖函數,BSD 的 flock 函數,SVR4 的 lockf 函數,這些默認都是建議鎖。
這個簡單的實現只是建議鎖,需要每個對文件的操作的進程都遵循同樣的鎖操作才能起作用,這些進程稱為合作進程(Cooperative processes),但實際使用時會有例外的情況,如果另外開一個終端窗口直接寫 test.file 文件,會發現可以直接寫,因為這種寫沒有鎖操作,不是合作進程,這種情況就需要用強制鎖(Mandatory locking)了。
強制鎖的實際代碼和上面的完全一樣,不過在 Linux 上需要做一些改動:
掛載文件系統時需要加 mand 參數在文件系統上啟用強制鎖支持,比較新的 Linux kernel 里已經基本在所有文件系統上都實現了;
去掉程序的組執行權限;
增加程序的設置組ID權限。
第二項和第三項在普通情況下實際上是自相矛盾的,所以 Linux 就用這種特殊情況就表示啟用強制鎖(Mandatory locking)了。
備注
使用 BSD 的 flock 函數時不能使用強制鎖,見 Linux kernel 源碼下 mandatory-locking.txt 中的說明:
Mandatory locks can only be applied via the fcntl()/lockf() locking
interface - in other words the System V/POSIX interface. BSD style
locks using flock() never result in a mandatory lock.
如果一個文件被某進程強制鎖住,另一個進程通過 creat 函數或者 open 時加 O_TRUNC 參數,都會導致函數調用失敗;
強制鎖在不同的 UNIX 及 類UNIX 系統中實現不同,第二個備注中的 O_TRUNC 參數便是 Linux kernel 和 HP-UX 不同的地方;
tmpfs、nfs 也支持強制鎖,可以用這兩個文件系統方便測試;
刪除文件(unlink操作)再重新創建文件,會導致強制鎖失效;
Linux kernel 的強制鎖的實現并不完全可靠(感覺白寫了,哈哈,實際情況還要做處理),見 man fcntl 的說明。
強制鎖的實際操作:
mount -t tmpfs -o size=10m,mand tmpfs /mnt
cp test /mnt
cd /mnt
chmod g-x test
chmod g+s test
運行 test 程序,同時開另一個終端,直接用 echo 讀寫 test 文件,會發現強制鎖已經起作用。
無相關文章.
總結
以上是生活随笔為你收集整理的linux中断函数中有锁,Linux下fcntl实现建议锁和强制锁的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: linux 防火墙开启1521端口,li
- 下一篇: linux应用程序开发数据,《嵌入式li