UNIX LINUX程式設計學習之檔案鎖 記錄鎖

2021-06-16 07:18:43 字數 1945 閱讀 8156

**:

鎖定中的幾個概念

檔案鎖定的是整個檔案,而記錄鎖定只鎖定檔案的某一特定部分。unix 的記錄指的是從檔案的某一相對位置開始的一段連續的位元組流,它不同於其它以強制性記錄結構阻止檔案的作業系統,因此,unix 記錄鎖更恰當的稱呼應該是範圍鎖,它是對檔案某個範圍的鎖定。 

檔案和記錄鎖定可分為諮詢式鎖定和強制鎖定兩種。當正在執行的某一程序對它將要訪問的某一檔案進行了諮詢式鎖定後,其它想要訪問該檔案的程序將被作業系統告知共享檔案已經上了鎖,但這並不阻止它們對鎖定檔案的操作。只要有對鎖定檔案的訪問權,這些程序便可忽視諮詢式鎖定而去寫上了鎖的檔案。強制鎖定的含義則要嚴格多了,當某一共享檔案被強制後,作業系統將會對每個讀寫檔案的請求進行核查,只有在確證該請求不會干擾上了鎖的檔案時,才允許對應的操作。system v和 bsd 都提供了諮詢式鎖定方式。這兩種鎖定方式都被linux 支援。 

system v的諮詢鎖定

system v的鎖函式 lockf()具有如下的形式: 

#include

int lockf(int fd, int function, long size); 

引數 fd 是在檔案開啟操作中獲得的檔案描述符; 

引數 function 可以取如下的引數值: 

f_ulock 為乙個先前鎖定的區域解鎖 

f_lock 鎖定乙個區域 

f_tlock 測試並鎖定乙個區域 

f_test 測試乙個區域是否已經上鎖。 

引數 size 指明了從檔案當前位置開始的一段連續鎖定區域的長度,當 size 為 0 時,鎖定記錄將由當前位置一直擴充套件到檔案尾。 

函式 lockf()既可以用來上鎖有可以用來測試是否已經賞了鎖。 如果 lockf 的引數function為 f_lock 指定檔案的對應區域已被其它程序鎖定,那麼 lockf 的呼叫程序將被阻塞直到該區域解鎖。上述情況我們稱為阻塞。如果在呼叫 lockf()時把引數設為 f_tlovk,那麼當被測試的區域上了鎖時,lockf 便會立即返回-1,出錯返回碼 errno 將為 eagain,它是乙個非阻塞呼叫。 

c**  

#include 

my_lock(int

fd)  

}  my_unlock(int

fd)  

}  bsd的諮詢式鎖定

bsd unix 作業系統提供了如下形式的呼叫來鎖定和解鎖乙個檔案: 

#include

int flock(int fd, int operation); 

呼叫 flock有兩個引數: 

引數 fd 是乙個已開啟檔案的檔案描述符; 

引數 operation 可設定為下述各值: 

lock_sh 共享鎖 

lock_ex  互斥鎖 

lock_un 解鎖 

lock_nb 當檔案已被鎖定時不阻塞 

bsd unix使用flock()來請求對指定檔案的諮詢式鎖定和解鎖。bsd的諮詢鎖有共享鎖和互斥鎖兩種。在任一給定時刻,多個程序可以用於屬於同一檔案的共享鎖,但是某共享檔案不能同時具有多個互斥鎖或存在共享鎖和互斥鎖共存的情況。如果鎖定成功,flock將返回零,否則返回-1。 

c**  

#include 

my_flock(int

fd)  

}  my_unload(fd)  

}  前面兩種鎖定方式的比較 

由於 linux 支援上面的兩種鎖定方式,所以可以根據不同的實際情況選用不同的鎖定方式。以上的兩種鎖定方式有以下的不同: 

1.system v的鎖定方式是記錄鎖定,可以指定鎖定的範圍。而 bsd 的鎖定方式是檔案鎖定,只能指定鎖定檔案。 

2.system v的鎖定是每個程序所獨有的,可以用於父子程序間的共享鎖定。而 bsd的鎖定方式是可以繼承的,父子程序間使用的是同一鎖定的,所以不能用於父子程序間的檔案共享鎖定 

UNIX LINUX程式設計學習之程序通訊 共享記憶體

共享記憶體 shared memory 共享記憶體,簡單的說就是被多個程序共享的記憶體。它在各種程序通訊方法中是最快的,因為它是將資訊直接對映到記憶體中,省去了其它 ipc方法的中間步驟。1.shmid ds 共享記憶體也有乙個給系統記憶體用來儲存相關資訊的機構,就是shmid ds。c struc...

Unix Linux環境程式設計學習總結

這段時間學習了unix環境高階程式設計,在這裡呢,先給大家推薦一本書 unix環境高階程式設計 這本書在這個領域可是聖經級別的。先說一下這段時間的學習感受,起初學習了幾天之後,休息了一段時間,於是自己照著那本聖經開始看了起來,有很多難懂的地方,看著看著,難免心態有點崩潰,但是還是咬著牙看了下去,雖然...

UNIX LINUX程式設計書籍

排名不分先後 1.c語言 高質量程式設計指南 c語言介面與實現 c語言解惑 c專家程式設計 c陷阱與缺陷 c語言參考手冊 2.linux應用開發 unix網路程式設計 第1,2卷 unix環境高階程式設計 linux系統程式設計 unix linux程式設計實踐教程 linux程式設計 第3版 un...