linux 记录锁 在文件尾加锁

不知者不罪 2017-10-18 08:25:40
在《unix 高级环境编程》书中说到的在文件尾端加锁,如下:

writew_lock(fd, 0, SEEK_END, 0);
write(fd, buf, 1); //这个字节也被加锁
un_lock(fd, 0, SEEK_END, 0); //并没有解锁前面字节,len指定为-1可解锁前面字节
write(fd, buf, 1);
代码序列所作的可能并不是你所期望的。它得到一把写锁,该写锁从当前文件尾端起,包括以后可能添加到该文件的任何数据。假定在文件尾端时执行第一个write,它给文件添写了1个字节,而该字节将被加锁。跟随其后的解锁,其作用是对以后添写到文件上的数据不再加锁,但在它之前刚添写的一个字节则保留加锁。当执行第二个写时,文件尾端又延伸了1个字节,但该字节并未加锁。
当对文件的一部分加锁时,内核将指定的偏移量变换成绝对文件偏移量。另外,除了指定一个绝对偏移量(SEEK_SET)之外,fcntl还允许我们相对于文件中的某个点(当前偏移量(SEEK_CUR)或文件尾端(SEEK_END))指定该偏移量。当前偏移量和文件尾端是可能不断变化的,而这种变化又不应影响现存锁的状态,所以内核必须独立于当前文件偏移量或文件尾端而记住锁。
如果我们想要解除第一次write所写1个字节上的锁,那么应指定长度为-1。负的长度值表示在指定偏移量之前的字节数。

小弟没看明白, 有如下几个问题:
1、为什么对填写的1字节加锁,write后解锁,后面write的字节却说是已经加锁的呢? un_lock(fd, 0, SEEK_END, 0); 解锁
的区域是哪一段呢?
2、 解除第一次write所写1个字节上的锁, 长度为-1, 这里说的是un_lock(fd, 0, SEEK_END, 0); 的长度为-1吧? 为什么这样
就可以解锁第一write呢?
3、有没有类似的应用程序例子呢?给小弟发一份看看。
...全文
917 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
KimenWu 2017-10-18
  • 打赏
  • 举报
回复
第一个问题: 假设当前的文件长度为N(可以假设任何数),执行 writew_lock(fd, 0, SEEK_END, 0);//对位置N进行加锁(由于文件是从0编号的,N代表了文件下一个要写的字节) write(fd, buf, 1); //这个时候文件的长度变成了N+1 un_lock(fd, 0, SEEK_END, 0); //对N+1的位置进行解锁。也就是说N的位置没有解锁。 第二个问题: 指定长度为-1,指的是从文件未特尾向前移一个字节。-2就是两个字节…………,这是由SEEK_END这个选项决定的。同样的,如果将一参数设置为SEEK_CUR,负数表示当前位置往前移。

2,161

社区成员

发帖
与我相关
我的任务
社区描述
Linux/Unix社区 UNIX文化
社区管理员
  • UNIX文化社区
  • 文天大人
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧