我正在阅读POSIX specification,我无法完全理解文件描述符,文件描述和流如何交互。
FILE* f1 = fopen("a.txt", "r");
int fno = fileno(f1);
FILE* f2 = fdopen(fno, "r");
// is it true?
assert(fileno(f2) == fno);
// does it close only f1 or f2 too?
fclose(f1);
fgetc(f2); // valid?
(问题在评论中。)
答案 0 :(得分:4)
C标准库为您提供了不透明指针FILE*
,一个文件句柄,您可以使用fopen()
/ fclose()
进行操作,并使用{ {1}} / fread()
。
POSIX提供了文件描述符的概念,它们是整数。您可以使用fwrite()
/ open()
来操纵这些内容,并使用close()
/ read()
进行访问。
对于POSIX系统上的每个打开文件句柄write()
,您可以使用FILE * fp
获取基础文件描述符。相反,对于现有文件描述符fileno(fp)
,您可以使用n
打开标准文件句柄。
换句话说,POSIX文件描述符是一个操作系统原语,用于实现 C标准库。请注意,POSIX文件描述符也可用作套接字的句柄。
您对fdopen(n)
的最终调用未定义,因为fgets()
使文件句柄失效,从而使其基础文件描述符无效。 fclose()
不重复文件描述符。
答案 1 :(得分:1)
是的,它是真的,它关闭两个文件,因为它们使用相同的文件描述符。