本文主要是介绍fcntl函数对文件锁的操作,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
在Shell下输入man fcntl可获取函数原型
#include<stdio.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <fcntl.h>
#include <unistd.h>
#include <fcntl.h>
#include<string.h>
int lock_set(int fd,struct flock *lock)
{
if (fcntl(fd,F_SETLK,lock)==0)
{
if (lock->l_type==F_RDLCK)
{
printf("set read lock,pid:%d\n",getpid());
}
else if (lock->l_type==F_WRLCK)
{
printf("set wirte lock,pid:%d\n",getpid());
}
else if (lock->l_type==F_UNLCK)
{
printf("release lock,pid:%d\n",getpid());
}
}
else
{
perror("lock operation failed\n");
return -1;
}
return 0;
}
int lock_test(int fd, struct flock *lock)
{
if (fcntl(fd,F_GETLK,lock)==0)
{
if (lock->l_type==F_UNLCK)
{
printf("lock can be set in fd\n");
return 0;
}
else
{
if (lock->l_type==F_RDLCK)
{
printf("can't be set,read lock has been set by:%d\n",lock->l_pid);
}
else if (lock->l_type==F_WRLCK)
{
printf("can't be set,write lock has been set by:%d\n",lock->l_pid);
}
return -2;
}
}
else
{
perror("get lock failed");
return -1;
}
}
int main()
{
int fd;
char buf[64]="Hello World!";
char read_buf[64];
struct flock lock;
memset(read_buf,0,64);
if ((fd=open("lala.c",O_CREAT|O_TRUNC|O_RDWR,S_IRWXU))==-1)
{
perror("open fail");
return 1;
}
write(fd,buf,strlen(buf));
memset(&lock,0,sizeof(struct flock));
lock.l_start=SEEK_SET;
lock.l_len=0;
lock.l_whence=0;
lock.l_type=F_RDLCK;
if(lock_test(fd,&lock)==0)
{
lock.l_type=F_RDLCK;
lock_set(fd,&lock);
}
close (fd);
return 0;
}
这篇关于fcntl函数对文件锁的操作的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!