有三種不同的檔案鎖,這三種都是「諮詢性」的,也就是說它們依靠程式之間的
合作,所以乙個專案中的所有程式封鎖政策的一致是非常重要的,當你的程式需
要和第三方軟體共享檔案時應該格外地小心。
有些程式利用諸如 filename.lock
的檔案鎖檔案,然後簡單地測試此類檔案是否存在。這種方法顯然不太好,因為當產生檔案的程序被殺後,鎖檔案依然存在,這樣檔案也許會被永久鎖住。uucp
中把產生檔案的程序號pid存入檔案,但這樣做仍然不保險,因為pid的利用是**型的。
這裡是三個檔案鎖函式:
flock();
lockf();
fcntl();
flock()是從bsd中衍生出來的,但目前在大多數unix系統上都能找到,在單個主
機上flock()簡單有效,但它不能在nfs上工作。perl中也有乙個有點讓人迷惑的
flock()函式,但卻是在perl內部實現的。
fcntl()是唯一的符合posix標準的檔案鎖實現,所以也是唯一可移植的。它也同
時是最強大的檔案鎖--也是最難用的。在nfs檔案系統上,fcntl()請求會被遞
交給叫rpc.lockd的守護程序,然後由它負責和主機端的lockd對話,和flock()
不同,fcntl()可以實現記錄層上的封鎖。
lockf()只是乙個簡化了的fcntl()檔案鎖介面。
無論你使用哪一種檔案鎖,請一定記住在鎖生效之前用sync來更新你所有的檔案
輸入/輸出。
**示例1
1lock
(fd);
2write_to(some_function_of(fd));
3 flush_output_to(fd); /*
在去鎖之前一定要沖洗輸出 */4
unlock(fd);
5 do_something_else; /*
也許另外乙個程序會更新它 */6
lock
(fd);
7 seek(fd, somewhere); /*
因為原來的檔案指標已不安全 */8
do_something_with(fd); ...
9一些有用的fcntl()封鎖方法(為了簡潔略去錯誤處理):
10 #include ;
11 #include ;
1213 read_lock(int fd) /*
整個檔案上的乙個共享的檔案鎖
*/14
1718 write_lock(int fd) /*
整個檔案上的乙個排外檔案鎖
*/19
22乙個封鎖檔案結尾的鎖,
24其他程序可以訪問現有內容
*/25
28前面所用的file_lock函式如下:
29struct flock* file_lock(short type, short
whence)
30
**示例2
12 #include 3 #include 4 #include 5 #include
6struct flock* file_lock(short type, short
whence)716
intmain()17;
22 sprintf(buf, "
hello world %d/n
", i);
23int len =strlen(buf);
24write(fd, buf, len);
25fcntl(fd, f_setlkw, file_lock(f_unlck, seek_set));
26 sleep(1
);27}28
close(fd);29}
30//
lock2.c...同lock.c相比只是修改了下buf內容
31 #include 32 #include 33 #include 34 #include
35struct flock* file_lock(short type, short
whence)
3645
intmain()46;
51 sprintf(buf, "
china %d/n
", i);
52int len =strlen(buf);
53write(fd, buf, len);
54fcntl(fd, f_setlkw, file_lock(f_unlck, seek_set));
55 sleep(1
);56}57
close(fd);58}
5960 g++ lock.c -o 1
61 g++ lock2.c -o 2
62 執行兩個程式就能看到互斥的效果了
Unix 檔案鎖 共享鎖 排他鎖
fcntl函式 flock結構對檔案鎖的操作 例子 協議鎖和強制鎖 檔案鎖的核心結構 unix提供了檔案鎖機制來防止多程序對同一檔案的併發操作導致的髒讀和資料混亂,同時也為多程序提供了同步機制。鎖型別共享鎖 讀鎖 共享鎖也稱為讀鎖。如果乙個程序為某個檔案的某個區域加了一把共享鎖,那麼其他程序對該檔案...
Linux 檔案鎖的分類及操作
有三種不同的檔案鎖,這三種都是 諮詢性 的,也就是說它們依靠程式之間的 合作,所以乙個專案中的所有程式封鎖政策的一致是非常重要的,當你的程式需 要和第三方軟體共享檔案時應該格外地小心。有些程式利用諸如 filename.lock 的檔案鎖檔案,然後簡單地測試此類檔案是否存在。這種方法顯然不太好,因為...
linux檔案鎖例子
lock.c include include include include struct flock file lock short type,short whence close fd lock2.c.同lock.c相比只是修改了下buf內容 include include include in...