2

我读了一本关于 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是一个非阻塞的,为此我们将成功地写出“我是第二个”。

谢谢

4

2 回答 2

0
lockf(fd2,F_TLOCK,17)

遇到错误 (EAGAIN),因此返回 -1。写入文件所需的值等于或大于 0,而不是 -1。测试失败,写入永远不会发生。

于 2012-07-04T21:26:35.370 回答
0

父进程lockf(fd, F_TLOCK, 16)在打开的文件上执行,锁定第一个16字节。然后它在里面写入文本并等待孩子退出。它不会关闭文件,因此锁定仍然存在。如果close(fd);在 之后的父代码中有 a write(),则锁将被释放但没有。

孩子先睡了一会儿,当它试图锁定文件的前 17 个字节但由于父仍然拥有锁定而失败。这就是lockf(fd2, F_TLOCK, 17)失败的原因EAGAIN- 该操作应稍后重复。错误由返回值发出信号,该返回值-1使子代码中的条件不执行。

于 2012-07-04T21:44:54.930 回答