linux目录加了一把锁怎么办,linux 文件加锁 lockf 小结

项目中涉及数据的读取和发送,由于对线程不熟悉,我将读取和发送分成了两个独立的程序,先实现功能再更新为多线程版本。但两个程序共用一个文件时同样会出现同步问题。所以必须加锁。

这次选择的是lockf。在实验时a.b程序交替往同一文件写东西需要注意的

(错误 版本)--》由于每次解锁都是对后面的部分解锁,所以b程序仍然无法获得可写的锁,所以结果是a程序一直写,等结束了,b才可以写。

for(i=0;i<3;i++)

9 {

10 print_time("a start lock");

12 lockf(fd,F_LOCK,0);

13 print_time("a get lock");

14 buff_a[2]=i+'0';

16 write(fd,buff_a,4);

17 sleep(5);

19 lockf(fd,F_ULOCK,0);

20 print_time("a reless lock");

22 sleep(1);

23 }

(正确版本1)--》为解决解锁问题,我们在每次写完后立即调用fclose来达到关闭锁的目的。

for(i=0;i<3;i++)

{

Open(&fd);

print_time("a start lock");

lockf(fd,F_LOCK,0);

print_time("a get lock");

buff_a[2]=i+'0';

write(fd,buff_a,4);

sleep(5);

//lockf(fd,F_ULOCK,0); ---》此指令是释放目前到后面的锁。如果没有后面的close,b仍然无法获取锁。

print_time("a reless lock");

close(fd);--》关闭文件IO,可以释放前面所加的锁。

sleep(2);

}

return 0;

(正确版本2)--》如果不关闭IO,可以通过lseek指针的移动来达到完整加锁和完整解锁的目的,这样a,b程序可以正确的依次往共用文件里写东西。

Open(&fd);

8 for(i=0;i<3;i++)

9 {

10 print_time("a start lock");

11 lseek(fd,SEEK_SET,0);

12 lockf(fd,F_LOCK,0);

13 print_time("a get lock");

14 buff_a[2]=i+'0';

15 lseek(fd,SEEK_END,0);--》因为是添加到文件末尾,所以要移动指针。

16 write(fd,buff_a,4);

17 sleep(5);

18 lseek(fd,SEEK_SET,0);--》必须对全部文件解锁,这样b才可以得到写的权限。

19 lockf(fd,F_ULOCK,0);

20 print_time("a reless lock");

21 //close(fd);

22 sleep(1);

23 }

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值