文件锁的类型
& lt; br>
1读锁
<强>共享锁>强,如果一进程对文件的某区域加了读锁,B进程也可以在此区域加读锁,但是不能对此区域加写锁。
2写锁
<强>独占锁>强,如果一进程对文件的某个区域加了写锁,B进程就不能对此区域加写锁,也不能对此区域加读锁。
& lt; br>
当多个进程同时对一个文件进行读写操作时,为确保文件的完整和一致性,这几个进程要加锁同步。
& lt; br>
当进程开始读取文件的某个区域时,先加读锁,读完之后再解锁。
& lt; br>
3文件记录锁
文件记录锁
1。它函数原型:int fcntl (int fd, int cmd, struct flck 锁);
参数:fd:文件描述符;
? ? ?cmd:功能符号;(F_SETLK用来设置或释放锁;F_GETLK用来获得锁信息;)
? ? ?锁:存储锁信息的结构体指针;
? ? ?返回值:调用成功返回0,失败返回1
2。锁信息结构体
结构群
{
短l_type;/锁的类型/
短l_whence;/偏移量的起始位置:/
off_t l_start;/从l_whence的偏移量/
off_t l_len;/从l_start开始的字节数/
pid_t l_pid;/锁所属进程ID(一般不用)*/
}
& lt; br>
l_type有F_RDLCK读锁,F_WRLCK写锁及F_UNLCK空锁。
(! !注意:读锁,不会影响数据,可以一直加;但是写锁,只能加一次)
l_whence有SEEK_SET, SEEK_CUR和SEEK_END。
l_len为0时表示从起点开始直至最大可能位置为止。
& lt; br>
下面举个加写锁的例子:
<代码> # include & lt;stdio.h> # include & lt;unistd.h> # include & lt;fcntl.h>/* * fd int fctnl (int, int cmd, struct *锁);//cmd: F_SETLK设置或解放锁;F_GETLK获得锁信息;返回值:0 -成功,1 -失败 结构体群{ 短l_type;//锁:F_RDLCK F_WRLCK F_UNLCK 短l_whence;//如何翻译l_start: SEEK_SET SEEK_CUR SEEK_END off_t l_start;//起始偏移锁 off_t l_len;//锁定的字节数 pid_t l_pid;//PID进程阻塞我们的锁(仅F_GETLK) }; */int main () { int fd; int res; 结构体群锁={0}; 如果((fd=开放(“a.txt”, O_RDWR))==1) { fd=(“一个开放。txt”, O_CREAT); } 如果(fd==1) { printf("文件打开失败! \ n "); 返回1; }//printf (" fd=% d \ n”, fd);//判断是否有锁 它res=fcntl (fd, F_GETLK和锁); 如果(res==1) { perror(“判断有锁失败”); 返回1; } 如果锁。l_type !=F_UNLCK) { printf(“失败:文件锁定! \ n”); }//其他上写锁,读锁可以一直加,写锁只能加一个 { memset(和锁,0,sizeof (struct群)); 锁。l_whence=SEEK_SET; 锁。l_start=0; 锁。l_len=10; 锁。l_type=F_WRLCK; 它res=fcntl (fd, F_SETLK和锁); 如果(res==1) { perror(“上锁失败”); 返回1; }//操作文件 获取字符();//解锁 锁。l_type=F_UNLCK; 它res=fcntl (fd, F_SETLK和锁); 如果(res==1) { perror(“解锁失败”); 返回1; } } 关闭(fd); 返回0; } 代码>
& lt; br>
关于多个进程上锁的问题,本质上步骤一样,后面复习中陆续再更…