12

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

a = open("teste.txt", O_RDONLY);
b = open("teste.txt", O_RDONLY);
4

3 回答 3

15

为了补充@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

有关详细信息,请参见此处,尤其是最后的示例程序。

于 2018-08-08T15:09:30.920 回答
10

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

于 2013-06-27T21:26:43.817 回答
1

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

于 2019-02-27T01:11:43.187 回答