锁住文件linux,linux  文件和记录锁

a文件锁定的是整个文件,而记录锁定只锁定文件的某一特定部分。UNIX的记录指的

是从文件的某一相对位置开始的一段连续的字节流,它不同于其它以强制性记录结构阻止

文件的操作系统,因此,UNIX记录锁更恰当的称呼应该是范围锁,它是对文件某个范围

的锁定。

文件和记录锁定可分为咨询式锁定和强制锁定两种.

咨询式锁定后,其它想要访问该文件的进程将被操作系统告知共享文件已经上了锁,但这并不阻止它们对锁定文件的操作.只要有对锁定文件的存取权,这些进程便可忽视咨询式锁定而去写赏了锁的文件。强制锁定的含义则要严格多了,当某一共享文件被强制后,操作系统将会对每个读写文件的请求进行核查,只有在确证该请求不会干扰上了锁的文件时,才允许对应的操作.

System V 的咨询锁定:

F_ULOCK 为一个先前锁定的区域解锁

F_LOCK 锁定一个区域

F_TLOCK 测试并锁定一个区域

F_TEST 测试一个区域是否已经上锁。

#include

my_lock(int fd)

{

lseek(fd,0L,0);

if (lockf(fd,F_LOCK,0L)==-1)

{

perror("can't F_LOCK");

exit(1);

}

}

my_unlock(int fd)

{

lseek(fd,0L,0);

if(lockf(fd,F_ULOCK,0L)==-1)

{

perror("can't F_UNLOCK");

exit(1);

}

}

BSD 的咨询式锁定:

LOCK_SH 共享锁

LOCK_EX 互斥锁

LOCK_UN 解锁

LOCK_NB 当文件已被锁定时不阻塞

#include

my_flock(int fd)

{

if (flock(fd,LOCK_EX))==-1)

{

perror(“can LOCK_EX”);

exit(1);

}

}

my_unload(fd)

{

if (flock(fd,LOCK_UN)==-1)

{

perror(“can’t LOCK_UN”);

exit(1);

}

}

由于 Linux支持上面的两种锁定方式,所以可以根据不同的实际情况选用不同的锁定

方式。以上的两种锁定方式有以下的不同:

1.System V的锁定方式是记录锁定,可以指定锁定的范围。而BSD的锁定方式是文

件锁定,只能指定锁定文件。

2.System V的锁定是每个进程所独有的,可以用于父子进程间的共享锁定。而BSD

的锁定方式是可以继承的,父子进程间使用的是同一锁定的,所以不能用于父子进程间的

文件共享锁定。

文件锁:

structflock {

shortl_type;文件锁类型,读锁,写无锁

off_t l_start;字节偏移

shortl_whence;设置偏移

off_t l_len;0到文件结尾,长度

pid_t l_pid;返回值

};

F_SETLK 解锁orF_SETLKW上锁,

#include

#include

#include

#include

#include

intmain(intargc,char*argv[])

{

structflockfl={F_WRLCK,SEEK_SET,0,0,0};

intfd;

fl.l_pid=getpid();

if(argc>1)

fl.l_type=F_RDLCK;

if((fd=open("1.txt",O_RDWR))==-1){

perror("open");

exit(1);

}

printf("Press<ENTER>totrytogetlock:");

getchar();

printf("Tryingtogetlock...");

if(fcntl(fd,F_SETLKW,&fl)==-1){

perror("fcntl");

exit(1);

}

printf("gotlock\n");

printf("Press<ENTER>toreleaselock:");

getchar();

fl.l_type=F_UNLCK;

if(fcntl(fd,F_SETLK,&fl)==-1){

perror("fcntl");

exit(1);

}

printf("Unlocked.\n");

close(fd);

return0;

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值