歡迎來到Linux教程網
Linux教程網
Linux教程網
Linux教程網
Linux教程網 >> Linux基礎 >> Linux教程 >> Unix環境文件讀寫鎖

Unix環境文件讀寫鎖

日期:2017/2/28 16:17:58   编辑:Linux教程

1簡介:

做個假設,如果有多個進程,共同編輯一個文件,那個這個文件安最後的結果是什麼?在普通的Unix環境下,並沒有限制多個進程共同讀寫一個文件。但是,如果這種情況出現在數據庫中,怎麼辦。數據庫要嚴格限制數據的一致性。

記錄鎖(Record locking)是用來描述一個進程限制其他進程來修改其在文件讀寫部位數據的概念。其實記錄(Record)這個概念並不准確,因為在Unix下,任何文件只是字節流。

記錄鎖的實現方式有多種,早期的Berkeley系列僅僅用flock方法,這個方法鎖住整個文件,不是一個區域。System V Release 3通過fcntl方法,增加了記錄鎖的概念。這個方法提供達到整個文件安,小道一個字節的記錄鎖。flock建立在fcntl之上,提供了一個簡單的接口。

2 fcntl函數原型:

#include <fcntl.h>
int fcntl(int filedes, int cmd, ... /* struct flock *flockptr */ );
Returns: depends on cmd if OK (see following), 1 on error
fileds是要鎖定的文件描述符
對於cmd參數,可以使用的有: F_GETLK, F_SETLK, or F_SETLKW
第三個參數(flockptr),指向一個flock結構指針,flock的結構如下:
struct flock
{
short l_type;/*F_RDLCK, F_WRLCK, or F_UNLCK*/
off_t l_start;/*相對於l_whence的偏移值,字節為單位*/
short l_whence;/*從哪裡開始:SEEK_SET, SEEK_CUR, or SEEK_END*/
off_t l_len;/*長度, 字節為單位; 0 意味著縮到文件結尾*/
pid_t l_pid;/*returned with F_GETLK*/
};
結構體描述
鎖類型: F_RDLCK(讀共享鎖), F_WRLCK(寫互斥鎖),和F_UNLCK(對一個區域解鎖)
鎖開始: 鎖位置(l_whence),相對於l_whence要鎖或者解鎖的區域開始位置(l_start)
鎖長度: 要鎖的長度,字節計數(l_len)
鎖擁有者:記錄鎖的擁有進程ID,這個進程可以阻塞當前進程,僅F_GETLK形式返回

Copyright © Linux教程網 All Rights Reserved