open()如果我操作两次相同的文件会发生什么?

sda*_*fad 5 c file-descriptor

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

a = open("teste.txt", O_RDONLY);
b = open("teste.txt", O_RDONLY);
Run Code Online (Sandbox Code Playgroud)

Dre*_*wen 7

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

  • 是的,但是我想到了他的想法(我认为) (4认同)

Gab*_*是好人 5

为了补充@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;
}
Run Code Online (Sandbox Code Playgroud)

这将输出 aabbccddeeffgghhiijjkkllmmnnooppqqrrssttuuvvwwxxyyzz

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

  • @gateway2745因为如果它们共享相同的打开文件描述,则示例程序的输出将是“abcdef ...”而不是“aabbccdd”。示例程序的输出显示它们不共享相同的读取指针(偏移量)。 (3认同)