关于fcntl 文件锁的用法的疑问
林晓海 2013-06-25 02:24:41 #include <stdio.h>
#include <stdlib.h>
#include <sys/types.h>
#include <unistd.h>
#include <fcntl.h>
#include <string.h>
void Getlock_state(int fd,long start, long len)
{
struct flock lock;
lock.l_whence=SEEK_SET;
lock.l_start=start;
lock.l_len=len;
lock.l_type=F_WRLCK;
//lock.l_pid=getpid();
printf("%d\n",fcntl(fd,F_GETLK,&lock));
if(lock.l_type==F_RDLCK)
{
printf("The (%ld-%ld) range content lock type is:RDLOCK\n",start,start+len);
}
else if(lock.l_type==F_WRLCK)
{
printf("The (%ld-%ld) range content lock type is:WRLOCK\n",start,start+len);
}
else if(lock.l_type==F_UNLCK)
{
printf("The (%ld-%ld) range content is free of lock\n",start,start+len);
}
else
{
printf("unknown lock type!\n");
}
}
void Lock_content(int fd,int lock_Type,long start,long len)
{
struct flock lock;
lock.l_type=lock_Type;
lock.l_whence=SEEK_SET;
lock.l_start=start;
lock.l_len=len;
//lock.l_pid=getpid();
printf("%d\n",fcntl(fd,F_SETLKW,&lock));
printf("lock (%ld-%ld) range\n",start,start+len);
}
void Unlock_content(int fd,long start,long len)
{
struct flock lock;
lock.l_type=F_UNLCK;
lock.l_whence=SEEK_SET;
lock.l_start=start;
lock.l_len=len;
//lock.l_pid=getpid();
printf("%d\n",fcntl(fd,F_SETLKW,&lock));
printf("free of lock (%ld-%ld) range\n",start,start+len);
}
int main(int argc,char *argv[])
{
int fd;
if((fd=open("./testfcntllock",O_CREAT|O_RDWR,0755))==-1)
{
perror("open error!\n");
exit(EXIT_FAILURE);
}
char *ptr="This is the test content!\n";
Lock_content(fd,F_WRLCK,0,strlen(ptr)-10);
Getlock_state(fd,0,strlen(ptr)-10);
write(fd,ptr,strlen(ptr));
Unlock_content(fd,0,strlen(ptr)-10);
Getlock_state(fd,0,strlen(ptr)-10);
Lock_content(fd,F_RDLCK,0,strlen(ptr)-10);
Getlock_state(fd,0,strlen(ptr)-10);
return 0;
}
为什么运行结果是下面的:都是提示没有上锁啊??
0
lock (0-16) range
0
The (0-16) range content is free of lock
0
free of lock (0-16) range
0
The (0-16) range content is free of lock
0
lock (0-16) range
0
The (0-16) range content is free of lock