如果我打开同一个文件两次,会出现错误吗?还是会创建两个不同的文件描述符?例如:
a = open("teste.txt", O_RDONLY);
b = open("teste.txt", O_RDONLY);
如果我打开同一个文件两次,会出现错误吗?还是会创建两个不同的文件描述符?例如:
a = open("teste.txt", O_RDONLY);
b = open("teste.txt", O_RDONLY);
为了补充@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
有关详细信息,请参见此处,特别是末尾的示例程序。