int lock_set(int fd,int type)
{
struct flock old_lock,lock;
lock.l_whence = SEEK_SET;
lock.l_start = 0;
lock.l_len = 0;
lock.l_type = type;
lock.l_pid = -1;
fcntl(fd,F_GETLK,&lock);
if(lock.l_type != F_UNLCK)
{
if (lock.l_type == F_RDLCK)
{
printf("Read lock already set by %d\n",lock.l_pid);
}
else if (lock.l_type == F_WRLCK)
{
printf("Write lock already set by %d\n",lock.l_pid);
}
}
lock.l_type = type;
if ((fcntl(fd,F_SETLKW,&lock)) < 0)
{
printf("Lock failed : type = %d\n",lock.l_type);
return 1;
}
switch (lock.l_type)
{
case F_RDLCK:
{
printf("Read lock set by %d\n",getpid());
}
break;
case F_WRLCK:
{
printf("write lock set by %d\n",getpid());
}
break;
case F_UNLCK:
{
printf("Release lock by %d\n",getpid());
return 1;
}
break;
default:
break;
}
return 0;
}
下面的实例是文件写入锁的测试用例,文件名为,linuxidc.wirte_lock.c 。
这里首先创建了一个hello 文件,之后对其上写入锁,最后释放写入锁,代码如下所示:
#include<stdio.h>
#include <unistd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdlib.h>
#include "linuxidc.c"
int main(void)
{
int fd;/* 首先打开文件*/
fd = open("hello",O_RDWR | O_CREAT, 0644);if(fd < 0)
{
printf("Open file error\n");
exit(1);
}
lock_set(fd, F_WRLCK); /* 给文件上写入锁*/
getchar(); /*程序暂停,按回车键继续*/
lock_set(fd, F_UNLCK); /* 给文件解锁*/
getchar();
close(fd);
exit(0);
return 0;
}
运行截图如下:
在PC机上测试:
开启两个终端,并且在两个终端上同时运行该程序,以达到多个进程操作一个文件的效果。
首先在终端1运行,然后在终端2上运行,注意终端二中的第一行输出。
由此可见,写入锁为互斥锁,同一时刻只能有一个写入锁存在。
接下来的程序是文件读取锁的测试用例,原理和上面的程序一样。文件名为linuxidc.read_lock.c。
#include <unistd.h>
#include <sys/file.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <stdio.h>
#include <stdlib.h>
#include "linuxidc.c"
int main(void)
{
int fd;fd = open("hello",O_RDWR | O_CREAT, 0644);if(fd < 0)
{
printf("Open file error\n");
exit(1);
}
lock_set(fd, F_RDLCK); /* 给文件上读取锁*/
getchar();
lock_set(fd, F_UNLCK); /* 给文件解锁*/
getchar();
close(fd);
exit(0);
return 0;
}
运行结果如下:
同样开启两个终端,并首先启动终端一上的程序,其运行结果如下所示:
观察可知,读锁是共享锁。
Linux公社的RSS地址:https://www.linuxidc.com/rssFeed.aspx