文件鎖

文件鎖可用於實現多用戶多任務共享數據

linux提供兩種方法實現文件鎖定:

1.以原子操作的方式創建一個文件,我們稱之爲鎖文件,當這個文件被創建後,不允許其他進程再創建同名文件

2.第二種方法允許程序鎖定文件的一部分,從而可以獨享對這部分內容的訪問,這種方法被稱爲區域鎖定

#include <fcntl.h>

int fcntl(int fildes, int command, ...);

fcntl()對一個打開的文件描述符進行操作,並能根據command參數的設置完成不同的任務.command爲我們提供了三個用於文件鎖的命令:

1.F_GETLK

使用這三個命令時,第三個參數必須是一個flock結構體指針,所以有效的函數原型應該是

  int fcntl(int fildes, int command, struct flock *flock_struct);

flock結構依賴於具體的實現,但它至少包括下述成員:

short  l_type:鎖的類型,有三種取值:

  F_RDLCK是共享鎖,其他進程可以擁有同一區域上的共享鎖,只要任一進程擁有該區域的共享鎖,就沒有進和能夠擁有該區的獨佔鎖,文件必須以讀或讀/寫方式打開;

  F_WRLCK獨佔鎖.只有一個進程可以在文件的某個區域擁有一把獨享鎖,一旦一個進程擁有了獨享鎖,那麼相應的區域就不能再有任務鎖,文件需以寫或讀/寫方式打開;     

  F_UNLCK解鎖,用來清除鎖

short  l_whence:區域的開頭方式,他的取值只能是SEEK_SET,SEEK_CUR, SEEK_END三個中的一個,SEEK_SET表示從文件頭開始,SEEK_CUR表示從文件當前位置開始,SEEK_END表示從文件尾開始.l_chence定義了l_start的偏移量

off_t   l_start:區域開始的相對位置

off_t   l_len:區域的長度

pid_t  l_pid:鎖持有者的進程id

F_GETLK命令獲得fildes參數打開的文件的鎖信息.它不會鎖定文件,只是返回阻止進程獲取鎖的文件信息.如果調用成功,則返回一個非-1的值,否則返回-1

2.F_SETLK:對文件的區域加鎖,fcntl()第二個參數設爲該命令時,l_pid不使用.如果調用成功,則返回一個非-1的值,否則返回-1,這個命令總是立即返回

3.F_SETLKW:與F_SETLK相似,但不會立即返回,而等待直到能夠獲取鎖爲止




發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章