POSIX文件描述符和C文件的交互

时间:2011-12-23 23:29:02

标签: c file posix file-descriptor

我正在阅读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?

(问题在评论中。)

2 个答案:

答案 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)

是的,它是真的,它关闭两个文件,因为它们使用相同的文件描述符。