Linux中的Linux / File和F_TLOCK问题

时间:2012-07-04 21:07:48

标签: c linux file-io fork

我读了一本关于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是一个非阻塞的,为此,我们会说“我在这里第二”。

由于

2 个答案:

答案 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发出信号,这使得子代码中的条件不会执行。