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、有没有类似的应用程序例子呢?给小弟发一份看看。