日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > linux >内容正文

linux

linux中断函数中有锁,Linux下fcntl实现建议锁和强制锁

發布時間:2025/4/5 linux 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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实现建议锁和强制锁的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。