我读了一本关于Linux中文件的书,它给出了下一个例子:
int main(char ** argv, int argc) {
int stat;
int fd = open("dugma1.txt", O_WRONLY, 0666);
if (fork() == 0) {
int fd2 = open("dugma1.txt", O_WRONLY, 0666);
sleep(10);
if (lockf(fd2, F_TLOCK, 17) >= 0) {
write(fd2, "I was here second", 17);
}
} //if
else {
lockf(fd, F_TLOCK, 16);
write(fd, "I was here first", 16);
wait(&stat);
}
}
它表示输出为:I was here first
,原因是:我们不关闭文件。但我不明白这个解释。我们先写一下:I was here first
,但为什么在sleep(10)
之后我们不会去代码的这一部分:
if (lockf(fd2, F_TLOCK, 17) >= 0) {
write(fd2, "I was here second", 17);
}
F_TLOCK
是一个非阻塞的,为此,我们会说“我在这里第二”。
由于
答案 0 :(得分:0)
lockf(fd2,F_TLOCK,17)
遇到错误(EAGAIN),因此返回-1。写入文件所需的值等于或大于0,而不是-1。测试失败,写入永远不会发生。
答案 1 :(得分:0)
父项在打开的文件上执行lockf(fd, F_TLOCK, 16)
,锁定第一个16
个字节。然后它将文本写入内部并等待孩子退出。它不会关闭文件,因此锁定仍然存在。如果在close(fd);
之后父代码中有write()
,则锁定已经释放但是没有。
孩子首先睡了一会儿,当它试图锁定文件的前17个字节但由于父母仍有锁而失败。这就是lockf(fd2, F_TLOCK, 17)
因EAGAIN
而失败的原因 - 操作应该在以后重复。错误由返回值-1
发出信号,这使得子代码中的条件不会执行。