我們提供的服務(wù)有:做網(wǎng)站、成都網(wǎng)站建設(shè)、微信公眾號開發(fā)、網(wǎng)站優(yōu)化、網(wǎng)站認證、漢南ssl等。為上千多家企事業(yè)單位解決了網(wǎng)站和推廣的問題。提供周到的售前咨詢和貼心的售后服務(wù),是有科學(xué)管理、有技術(shù)的漢南網(wǎng)站制作公司
共享鎖,如果A進程對文件的某區(qū)域加了讀鎖,B進程也可以在此區(qū)域加讀鎖,但是不能對此區(qū)域加寫鎖。
獨占鎖,如果A進程對文件的某個區(qū)域加了寫鎖,B進程就不能對此區(qū)域加寫鎖,也不能對此區(qū)域加讀鎖。
當(dāng)多個進程同時對一個文件進行讀寫操作時,為確保文件的完整和一致性,這幾個進程要加鎖同步。
當(dāng)進程開始讀取文件的某個區(qū)域時,先加讀鎖,讀完之后再解鎖。
文件記錄鎖
1.函數(shù)原型:int fcntl (int fd,int cmd,struct flck lock);
參數(shù):fd:文件描述符;
??cmd:功能符號;(F_SETLK用來設(shè)置或釋放鎖; F_GETLK用來獲得鎖信息;)
??lock:存儲鎖信息的結(jié)構(gòu)體指針;
??返回值:調(diào)用成功返回0,失敗返回-1
2.鎖信息結(jié)構(gòu)體
struct flock
{
short l_type; / 鎖的類型 /
short l_whence; / 偏移量的起始位置: /
off_t l_start; / 從l_whence的偏移量 /
off_t l_len; / 從l_start開始的字節(jié)數(shù) /
pid_t l_pid; / 鎖所屬進程ID(一般不用) */
}
l_type有F_RDLCK讀鎖、F_WRLCK寫鎖及F_UNLCK空鎖。
(!!注意:讀鎖,不會影響數(shù)據(jù),可以一直加;但是寫鎖,只能加一次)
l_whence有SEEK_SET、SEEK_CUR和SEEK_END。
l_len為0時表示從起點開始直至最大可能位置為止。
下面舉個加寫鎖的例子:
#include < stdio.h>
#include < unistd.h>
#include < fcntl.h>
/**
int fctnl(int fd,int cmd,struct *lock); //cmd:F_SETLK設(shè)置或解放鎖;F_GETLK獲得鎖信息;返回值:0-成功,-1-失敗
struct flock{
short l_type; // of lock:F_RDLCK,F_WRLCK,F_UNLCK
short l_whence; //How to interpreter l_start:SEEK_SET,SEEK_CUR,SEEK_END
off_t l_start; //Starting offset for lock
off_t l_len; //Number of bytes to lock
pid_t l_pid; //PID of process blocking our lock(F_GETLK only)
};
*/
int main()
{
int fd;
int res;
struct flock lock = {0};
if((fd = open("a.txt",O_RDWR)) == -1)
{
fd = open("a.txt", O_CREAT);
}
if(fd == -1)
{
printf("file open failed!\n");
return 1;
}
// printf("fd=%d\n",fd);
//判斷是否有鎖
res = fcntl(fd,F_GETLK,&lock);
if(res == -1)
{
perror("判斷有鎖失敗");
return 1;
}
if(lock.l_type != F_UNLCK)
{
printf("fail:the file has locked!\n");
}
else //上寫鎖,讀鎖可以一直加,寫鎖只能加一個
{
memset(&lock,0,sizeof(struct flock));
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 10;
lock.l_type = F_WRLCK;
res = fcntl(fd,F_SETLK,&lock);
if(res == -1)
{
perror("上鎖失敗");
return 1;
}
//操作文件
getchar();
//解鎖
lock.l_type = F_UNLCK;
res = fcntl(fd,F_SETLK,&lock);
if(res == -1)
{
perror("解鎖失敗");
return 1;
}
}
close(fd);
return 0;
}
關(guān)于多個進程上鎖的問題,本質(zhì)上步驟一樣,后面復(fù)習(xí)中陸續(xù)再更...