打开() 如果我打开同一个文件两次会发生什么?

16

如果我打开同一个文件两次,会出现错误吗?还是会创建两个不同的文件描述符?例如:

a = open("teste.txt", O_RDONLY);
b = open("teste.txt", O_RDONLY);
3个回答

20

为了补充@Drew McGowen所说的内容,

事实上,在这种情况下,当你在同一个文件上两次调用open()时,你会得到两个不同的文件描述符,它们指向同一个文件(同一物理文件)。但是,这两个文件描述符是独立的,因为它们指向两个不同的打开文件描述符(打开文件描述符是系统范围内打开文件表中的一个条目)。

因此,稍后在两个文件描述符上执行的读取操作是独立的。你可以从第一个描述符调用read()来读取一个字节,然后再次调用read()在第二个文件描述符上。由于它们的偏移量不共享,所以两个描述符都读取相同的内容。

#include <fcntl.h>

int main()
{
  // have kernel open two connection to file alphabet.txt which contains letters from a to z
  int fd1 = open("alphabet.txt",O_RDONLY);
  int fd2 = open("alphabet.txt",O_RDONLY);


  // read a char & write it to stdout alternately from connections fs1 & fd2
  while(1)
  {
    char c;
    if (read(fd1,&c,1) != 1) break;
    write(1,&c,1);
    if (read(fd2,&c,1) != 1) break;
    write(1,&c,1);
  }

  return 0;
}

这会输出 aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz

有关详细信息,请参见此处,特别是末尾的示例程序。


我们如何知道在第二次调用open()时是否会为新条目创建文件表,而不是共享第一个条目? - rohit_r
3
由于它们共享同一个打开文件描述符,示例程序的输出将会是"abcdef..."而不是"aabbccdd"。示例程序的输出表明它们不共享相同的读取指针(偏移量)。 - Gab是好人

12
在这种情况下,由于您将两个文件都以只读方式打开,因此您将获得两个不同的文件描述符,这些文件描述符引用同一个文件。请参阅open的手册页面了解更多详细信息。

1
它将在文件描述符表和文件表中创建一个新条目。但是,文件表中的两个条目(旧的和新的)都将指向inode表中的同一条目。

是的,但文件描述符表中的两个条目并不指向打开文件表中的同一条目。它们指向打开文件表中的两个不同条目,这些条目指向Vnode表中的同一条目。有许多间接层。 - Gab是好人

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接